उन पंक्तियों मानों को अपडेट करें जहां पंडों में कुछ शर्त पूरी की जाती है


98

कहो कि मेरे पास निम्नलिखित डेटाफ़्रेम हैं:

टेबल

स्तंभों के मूल्यों को अद्यतन करने के लिए सबसे कारगर तरीका क्या है करतब और another_feat जहां धारा संख्या है 2 ?

यही है क्या?

for index, row in df.iterrows():
    if df1.loc[index,'stream'] == 2:
       # do something

अद्यतन: यदि मेरे पास 100 से अधिक कॉलम हैं तो क्या करें? मैं उन स्तंभों को स्पष्ट रूप से नाम नहीं देना चाहता जिन्हें मैं अद्यतन करना चाहता हूं। मैं प्रत्येक कॉलम के मान को 2 से विभाजित करना चाहता हूं (स्ट्रीम कॉलम को छोड़कर)।

इसलिए स्पष्ट होना कि मेरा लक्ष्य क्या है:

सभी मानों को 2 पंक्तियों द्वारा विभाजित करना जिनकी धारा 2 है, लेकिन धारा स्तंभ को बदलना नहीं है

जवाबों:


204

मुझे लगता है कि locयदि आप दो कॉलम को एक ही मूल्य पर अपडेट करने की आवश्यकता है, तो आप इसका उपयोग कर सकते हैं :

df1.loc[df1['stream'] == 2, ['feat','another_feat']] = 'aaaa'
print df1
   stream        feat another_feat
a       1  some_value   some_value
b       2        aaaa         aaaa
c       2        aaaa         aaaa
d       3  some_value   some_value

यदि आपको अलग से अपडेट की आवश्यकता है, तो एक विकल्प का उपयोग होता है:

df1.loc[df1['stream'] == 2, 'feat'] = 10
print df1
   stream        feat another_feat
a       1  some_value   some_value
b       2          10   some_value
c       2          10   some_value
d       3  some_value   some_value

एक अन्य आम विकल्प है numpy.where:

df1['feat'] = np.where(df1['stream'] == 2, 10,20)
print df1
   stream  feat another_feat
a       1    20   some_value
b       2    10   some_value
c       2    10   some_value
d       3    20   some_value

संपादित करें: यदि आपको बिना किसी streamशर्त के सभी कॉलम विभाजित करने की आवश्यकता है True, तो उपयोग करें:

print df1
   stream  feat  another_feat
a       1     4             5
b       2     4             5
c       2     2             9
d       3     1             7

#filter columns all without stream
cols = [col for col in df1.columns if col != 'stream']
print cols
['feat', 'another_feat']

df1.loc[df1['stream'] == 2, cols ] = df1 / 2
print df1
   stream  feat  another_feat
a       1   4.0           5.0
b       2   2.0           2.5
c       2   1.0           4.5
d       3   1.0           7.0

मैंने अपना प्रश्न अपडेट किया, मेरे पास 100 से अधिक कॉलम हैं, मैं यह कैसे कर सकता था?
स्टैंको

1
@ स्टैंको - मुझे लगता है कि यह एक और सवाल है - आपको इस 100कॉलम को किसी तरह चुनने की जरूरत है । उदाहरण के लिए यदि 100पहले कॉलम की जरूरत हो df.columns[:100]तो उपयोग करें और फिर इसे पास करें loc
jezrael

मैं जरूरी नहीं कि पहले 100 कॉलम चाहता हूं, मैं सिर्फ कॉलम के सभी मूल्यों (स्ट्रीम कॉलम को छोड़कर) को 2 से विभाजित करना चाहता हूं जहां धारा 2 है
Stanko

loc और np.where के बीच इतना अंतर है कि स्थान पंक्तियों को बदल देता है जो केवल स्थिति को संतुष्ट करता है लेकिन np.where के पास यदि और कोई कथन है, तो यह सभी पंक्तियों को बदल देगा?
अम्बलू

1
@ अम्बलू - बिल्कुल।
jezrael

3

आप इसके साथ ऐसा ही कर सकते हैं .ix:

In [1]: df = pd.DataFrame(np.random.randn(5,4), columns=list('abcd'))

In [2]: df
Out[2]: 
          a         b         c         d
0 -0.323772  0.839542  0.173414 -1.341793
1 -1.001287  0.676910  0.465536  0.229544
2  0.963484 -0.905302 -0.435821  1.934512
3  0.266113 -0.034305 -0.110272 -0.720599
4 -0.522134 -0.913792  1.862832  0.314315

In [3]: df.ix[df.a>0, ['b','c']] = 0

In [4]: df
Out[4]: 
          a         b         c         d
0 -0.323772  0.839542  0.173414 -1.341793
1 -1.001287  0.676910  0.465536  0.229544
2  0.963484  0.000000  0.000000  1.934512
3  0.266113  0.000000  0.000000 -0.720599
4 -0.522134 -0.913792  1.862832  0.314315

संपादित करें

अतिरिक्त जानकारी के बाद, निम्नलिखित सभी कॉलम लौटाएंगे - जहां कुछ शर्त पूरी की जाती है - आधा मूल्यों के साथ:

>> condition = df.a > 0
>> df[condition][[i for i in df.columns.values if i not in ['a']]].apply(lambda x: x/2)

आशा है कि ये आपकी मदद करेगा!


यदि मेरे पास बहुत सारे कॉलम नहीं हैं, तो यह उल्लेखनीय है, मुझे यह कहना चाहिए कि मेरे पास 100 से अधिक कॉलम हैं।
Stanko

मैंने condition = (df.a == -1.001287)मानों को पंक्ति से विभाजित किए जाने के मूल्यों की अपेक्षा के साथ आपके अंतिम संपादन का परीक्षण किया, a == -1.001287लेकिन मुझे खाली डेटाफ़्रेम वापस मिल गया।
स्टैंको

हां, यह इसलिए है क्योंकि यह केवल प्रदर्शन है, वास्तविक मूल्य नहीं है, इस तरह वास्तविक मूल्य प्राप्त करें df.iloc[1,0]:। या बेहतर अभी तक अपने आप को मान सेट करें और फिर कोशिश करें:df.iloc[1,0] = 1.2345; condition = df.a == 1.2345
थानोस

मैं पीछा नहीं कर रहा हूँ, वास्तव में काम क्यों condition = (df.a == -1.001287)नहीं करता है?
स्टेनो

8
ixअब पदावनत हो गया है।
dbliss
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.