पंडों डेटाफ्रेम: शर्त के आधार पर सभी मानों को एक कॉलम में बदलें


132

मेरे पास निम्न की तरह एक सरल डेटाफ़्रेम है:

पंडों डेटाफ़्रेम

मैं 'फर्स्ट सीज़न' कॉलम से सभी मानों का चयन करना चाहता हूं और उन लोगों को प्रतिस्थापित करना है जो 1 99 0 से अधिक हैं। इस उदाहरण में, केवल बाल्टीमोर रेवेन्स को 1 की जगह 1996 (बाकी डेटा को बरकरार रखते हुए) रखा जाएगा।

मैंने निम्नलिखित का उपयोग किया है:

df.loc[(df['First Season'] > 1990)] = 1

लेकिन, यह उस पंक्ति के सभी मानों को 1 से बदल देता है, न कि केवल 'पहले सीज़न' कॉलम के मानों को।

मैं उस कॉलम से सिर्फ मान कैसे बदल सकता हूं?

जवाबों:


226

आपको उस कॉलम का चयन करना होगा:

In [41]:
df.loc[df['First Season'] > 1990, 'First Season'] = 1
df

Out[41]:
                 Team  First Season  Total Games
0      Dallas Cowboys          1960          894
1       Chicago Bears          1920         1357
2   Green Bay Packers          1921         1339
3      Miami Dolphins          1966          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers          1950         1003

तो यहाँ वाक्यविन्यास है:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

आप डॉक्स की जांच कर सकते हैं और पंडों को 10 मिनट भी बता सकते हैं जो शब्दार्थ को दर्शाता है

संपादित करें

आप एक बूलियन सूचक उत्पन्न करने के लिए चाहते हैं तो आपको सिर्फ बूलियन शर्त का उपयोग एक बूलियन श्रृंखला उत्पन्न करने के लिए और कास्ट करने के लिए कर सकते हैं dtype intपरिवर्तित कर देंगे Trueऔर Falseकरने के लिए 1और 0क्रमशः:

In [43]:
df['First Season'] = (df['First Season'] > 1990).astype(int)
df

Out[43]:
                 Team  First Season  Total Games
0      Dallas Cowboys             0          894
1       Chicago Bears             0         1357
2   Green Bay Packers             0         1339
3      Miami Dolphins             0          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers             0         1003

40

पार्टी के लिए थोड़ा देर से लेकिन फिर भी - मैं जहां खसखस ​​का उपयोग करना पसंद करता हूं:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])

2
मैं सशर्त रूप से कॉलम मानों को अधिलेखित करने के लिए एक समाधान की तलाश कर रहा था, लेकिन एक अन्य कॉलम के मूल्य के आधार पर, इस तरह: df ['col1'] = np.where (df ['id'] == '318431682253014', 'NEW', ' df ['col1']) यह इसके लिए समाधान था।
user582175

मैं इस तरह की कई स्थितियों के लिए ऐसा करने की कोशिश कर रहा हूं, लेकिन मैं इसे जारी रखता हूं ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()। मैं जो करने की कोशिश कर रहा हूं वह मूल रूप से है df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]। क्या किसी को इस पर एक विचार है?
एम। शचल

6
df['First Season'].loc[(df['First Season'] > 1990)] = 1

अजीब बात है कि किसी के पास इसका जवाब नहीं है, आपके कोड का एकमात्र गायब हिस्सा डीएफ के ठीक बाद ['फर्स्ट सीज़न' है और अपने अंदर के घुंघराले कोष्ठक को हटा दें।


यह एक 'SettingWithCopyWarning:' देता है। इसका उपयोग करना बेहतर है। EdChum के उत्तर जैसी संपूर्ण चीज़ के लिए।
महत्वाकांक्षी

2

एकल स्थिति के लिए, अर्थात। ( 'employrate'] > 70 )

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

इसे इस्तेमाल करो:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

इसलिए यहाँ सिंटैक्स है:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

कई स्थितियों के लिए अर्थात। (df['employrate'] <=55) & (df['employrate'] > 50)

इसे इस्तेमाल करो:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

इसलिए यहाँ सिंटैक्स है:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])

0
df.loc[df['First season'] > 1990, 'First Season'] = 1

स्पष्टीकरण:

df.locदो तर्क लेता है, 'पंक्ति सूचकांक' और 'स्तंभ सूचकांक'। हम जाँच रहे हैं कि क्या मूल्य "पहले सीज़न" कॉलम के तहत प्रत्येक पंक्ति मूल्य के 27 से अधिक है, और फिर हम इसे 1 से बदल रहे हैं।

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