पांडा एक कॉलम में मानों की स्थिति के आधार पर कई कॉलमों में मानों को अधिलेखित कर देते हैं


11

मेरे पास ऐसे डेटाफ़्रेम हैं:

df = pd.DataFrame(data={
    'col0': [11, 22,1, 5]
    'col1': ['aa:a:aaa', 'a:a', 'a', 'a:aa:a:aaa'],
    'col2': ["foo", "foo", "foobar", "bar"],
    'col3': [True, False, True, False],
    'col4': ['elo', 'foo', 'bar', 'dupa']})

मैं col1 में ":" पर विभाजित होने के बाद सूची की लंबाई प्राप्त करना चाहता हूं, फिर मैं मानों को अधिलेखित करना चाहता हूं यदि लंबाई> 2 या नहीं तो मानों को अधिलेखित करें यदि लंबाई <= 2।

आदर्श रूप में, जितनी जल्दी हो सके एक पंक्ति में।

वर्तमान में, मैं कोशिश करता हूं, लेकिन यह वैल्यूएयर लौटाता है।

df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])

EDIT: col1 पर शर्त। EDIT2: सभी महान और जल्दी से प्रदान किए गए उत्तर के लिए धन्यवाद। गजब का! EDIT3: 10 ^ 6 पंक्तियों पर समय:

@ansev 3.2657s

@ जेज़रेल 0.8922s

@ aky_91 1.9511s


पर हालत है col2या col1?
ऐश्वर्या ४

मैं गलती के लिए माफी मांगता हूं। यह col1 है।
dkrynicki

जवाबों:


8

सूची में फ़िल्टर किए गए स्तंभों के लिए सूची द्वारा उपयोग करें Series.str.count, जोड़ें 1, तुलना करें Series.gtऔर असाइन करें :

df.loc[df['col1'].str.count(":").add(1).gt(2), ['col1','col2','col3']] = ["", "", False]
print (df)
   col0 col1    col2   col3  col4
0    11               False   elo
1    22  a:a     foo  False   foo
2     1    a  foobar   True   bar
3     5               False  dupa

2
यह सबसे अच्छा जवाब है क्योंकि यह एक अस्थायी विभाजन को संग्रहीत नहीं करता है, लेकिन gt(1)1 और जोड़ने के बजाय इसका उपयोग क्यों नहीं किया जाता है gt(2)?
ऐशटेन 4

@ aishtain4 - योप, सहमत
jezrael

10

series.str.len()सूची की लंबाई निर्धारित करने के लिए आपको विभाजन के बाद की जरूरत है , तब आप तुलना कर सकते हैं और उपयोग कर सकते हैं .loc[], जहां भी स्थिति मैच हो, सूची असाइन करें:

df.loc[df['col1'].str.split(":").str.len()>2,['col1','col2','col3']]=["", "", False]
print(df)

   col0 col1    col2   col3  col4
0    11               False   elo
1    22  a:a     foo  False   foo
2     1    a  foobar   True   bar
3     5               False  dupa

5

एक और दृष्टिकोण के Series.str.splitसाथ expand = Trueऔर DataFrame.countसाथ है axis=1

df.loc[df['col1'].str.split(":",expand = True).count(axis=1).gt(2),['col1','col2','col3']]=["", "", False]
print(df)
   col0 col1    col2   col3  col4
0    11               False   elo
1    22  a:a     foo  False   foo
2     1    a  foobar   True   bar
3     5               False  dupa
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.