我需要使用数据框“结果”中未包括但在数据框“ df”中的行创建一个新的数据框,而无需创建新的过滤器。
我不知道该怎么做。你能帮我吗? (对不起,如果菜鸟有问题)
import pandas as pd
#Creating dataframe
d = {'col1': [1, 2,3,4,5,6,7,8,9,10], 'col2': ['a','b','b','b','c','d','c','a','z','c']}
df = pd.DataFrame(data=d)
#Finding the lines that contain a certain letter
a = df[df['col2'].str.contains("a")]
b = df[df['col2'].str.contains("b")]
c = df[df['col2'].str.contains("c")]
#Merge the 3 data frames
frames = [a, b, c]
results = pd.concat(frames)
print(results)
答案 0 :(得分:0)
更好的解决方案应该是使用|
将三个3个掩码合为一个来创建掩码,然后对于不匹配的行用~
来反转掩码:
m = df['col2'].str.contains("a|b|c")
results = df[m]
print(results)
col1 col2
0 1 a
1 2 b
2 3 b
3 4 b
4 5 c
6 7 c
7 8 a
9 10 c
df1 = df[~m]
print (df1)
col1 col2
5 6 d
8 9 z
您的解决方案应通过过滤不匹配的索引值来更改:
df1 = df[~df.index.isin(results.index)]
print (df1)
col1 col2
5 6 d
8 9 z
答案 1 :(得分:0)
首先合并 df 和结果
data=c(1,1,1,1,11,1,1,1,1,12,1,1,2,1,1,1)
sapply(data, function(x) ifelse (lag(x)!=1,lag(x),x))
然后使用new_df = pd.concat([df, results])
参数删除所有重复项,以从两个数据框中删除所有常见条目,您将获得所需的数据框
keep=False
答案 2 :(得分:0)
使用df.index.difference
-将返回不在其他数据框中的索引。
>>> df.iloc[df.index.difference(results.index)]
col1 col2
5 6 d
8 9 z
或
>>> df[~df.isin(results).all(1)]
col1 col2
5 6 d
8 9 z