我相信我的问题确实很简单,并且必须有一种非常简单的方法来解决此问题,但是由于我是Python的新手,所以我无法用自己的优雅解决方案来解决它。这个问题很可能是重复的,但是我找不到,所以,如果您对我的问题有另一个问题,请以另一种方式来阐述。
所以,假设我有以下数据框:
import pandas as pd
import matplotlib.pyplot as plt
data = {'Column A': [300,300,450,500,500,750,600,300,800],
'Column B': [1,1,2,2,3,3,0,2,3],
'Column C': ["Value_1", "Value_2", "Value_3", "Value_4", "Value_1",
"Value_2", "Value_3", "Value_4", "Value_5"]}
df = pd.DataFrame(data, columns=['Column A','Column B', 'Column C'])
从那里,我得到另外两个数据帧:
df1 = df.loc[(df['Column C'] == "Value_4")]
df2 = df.loc[(df['Column C'] == "Value_3")]
现在,我想创建第三个数据帧(df3),该数据帧由df(现有数据帧)中存在的,不在df1和df2中的行组成。我不想提取或更改现有数据框(df)上的任何内容。
希望我能做到简洁明了。非常感谢您在此方面的帮助!
答案 0 :(得分:3)
简单的方法是:
您必须为unique
和Column_C
获取df1
的{{1}}值,并创建df2
。
list
然后将NOT IN与df一起使用。
l=[df1['Column_C'].unique()[0],df2['Column_C'].unique()[0]]
答案 1 :(得分:1)
您可以从df.index中删除df2 + df3的索引,并使用diff来重新索引df:
df.reindex(df.index.difference(df1.index.union(df2.index)))
Column A Column B Column C
0 300 1 Value_1
1 300 1 Value_2
4 500 3 Value_1
5 750 3 Value_2
8 800 3 Value_5
答案 2 :(得分:1)
如果我理解,也许可以通过使用isin并使用~
来否定它(有很多方法可以解决您的问题,我发布了其中一种方法):
df3 = df.loc[~(df['Column C'].isin(df1['Column C'])) & ~(df['Column C'].isin(df2['Column C']))]
我们要做的是,检查c列中df中不在df1中的行,d列中的df和df2中的行与c列相同。然后留下其他行,如下所示。
输出:
Column A Column B Column C
0 300 1 Value_1
1 300 1 Value_2
4 500 3 Value_1
5 750 3 Value_2
8 800 3 Value_5
答案 3 :(得分:1)
将Index.intersection
与
Index.union
并按DataFrame.loc
选择行:
df3 = df.loc[df.index.difference(df1.index.union(df2.index))]
print (df3)
Column A Column B Column C
0 300 1 Value_1
1 300 1 Value_2
4 500 3 Value_1
5 750 3 Value_2
8 800 3 Value_5
另一个想法是使用Series.isin
,同时使用~
过滤和反转条件值:
df3 = df[~df['Column C'].isin(['Value_4','Value_3'])]
或者如果可能需要按成员资格的值测试所有列,则可以在indicator=True
中将merge
中的concat
与两个DataFrame一起使用:
s = df.merge(pd.concat([df1, df2]).drop_duplicates(), how='left', indicator=True)['_merge']
df3 = df[s == 'left_only']
print (df3)
Column A Column B Column C
0 300 1 Value_1
1 300 1 Value_2
4 500 3 Value_1
5 750 3 Value_2
8 800 3 Value_5
答案 4 :(得分:1)
您可以这样做:
df3 = df.loc[~(df['Column C'] == "Value_4") & ~(df['Column C'] == "Value_3")]