基于逻辑非从现有数据框架创建新数据框架

时间:2019-09-06 08:03:43

标签: python pandas dataframe

我相信我的问题确实很简单,并且必须有一种非常简单的方法来解决此问题,但是由于我是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)上的任何内容。

希望我能做到简洁明了。非常感谢您在此方面的帮助!

5 个答案:

答案 0 :(得分:3)

简单的方法是:

  1. 首先,您必须将列名设置为空格。

  1. 您必须为uniqueColumn_C获取df1的{​​{1}}值,并创建df2

    list

  1. 然后将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.intersectionIndex.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")]