डेटाफ़्रेम से पंक्तियों को "स्थिति में नहीं" पर आधारित [डुप्लिकेट]


97

मैं पंडों डेटाफ़्रेम से पंक्तियों को ड्रॉप करना चाहता हूं जब दिनांक स्तंभ का मान दिनांक की सूची में होता है। निम्नलिखित कोड काम नहीं करता है:

a=['2015-01-01' , '2015-02-01']

df=df[df.datecolumn not in a]

मुझे निम्नलिखित त्रुटि मिलती है:

ValueError: किसी श्रृंखला का सत्य मान अस्पष्ट है। A.empty, a.bool (), a.item (), a.any () या a.all () का उपयोग करें।

जवाबों:


180

आप उपयोग कर सकते हैं pandas.Dataframe.isin

pandas.Dateframe.isinप्रत्येक तत्व सूची के अंदर है aया नहीं इसके आधार पर बूलियन मान लौटाएगा । आप इसके बाद उलटा ~करने के लिए बदलने के Trueलिए Falseऔर इसके विपरीत।

import pandas as pd

a = ['2015-01-01' , '2015-02-01']

df = pd.DataFrame(data={'date':['2015-01-01' , '2015-02-01', '2015-03-01' , '2015-04-01', '2015-05-01' , '2015-06-01']})

print(df)
#         date
#0  2015-01-01
#1  2015-02-01
#2  2015-03-01
#3  2015-04-01
#4  2015-05-01
#5  2015-06-01

df = df[~df['date'].isin(a)]

print(df)
#         date
#2  2015-03-01
#3  2015-04-01
#4  2015-05-01
#5  2015-06-01

7
आप शायद मतलब है Series.isin, नहीं DataFrame.isin। आप स्तंभ के लिए तुलना कर रहे हैं, संपूर्ण df नहीं।
एक्यूमेनस

33

आप उपयोग कर सकते हैं Series.isin:

df = df[~df.datecolumn.isin(a)]

जबकि त्रुटि संदेश बताता है कि all()या any()उपयोग किया जा सकता है, वे केवल तब उपयोगी होते हैं जब आप परिणाम को एकल बूलियन मान में कम करना चाहते हैं। हालाँकि ऐसा नहीं है कि आप अभी क्या करने की कोशिश कर रहे हैं, जो कि बाहरी सूची के खिलाफ श्रृंखला में हर मूल्यों की सदस्यता का परीक्षण करना है, और परिणाम को बरकरार रखें (यानी, एक बूलियन श्रृंखला जो मूल DataFrame को स्लाइस करने के लिए उपयोग किया जाएगा। )।

आप इसके बारे में गोचकों में अधिक पढ़ सकते हैं ।

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