我是Python和Pandas的新手。我有以下数据帧:
import pandas as pd
df = pd.DataFrame( {'a':['A','A','B','B','B','C','C','C'], 'b':[1,3,1,2,3,1,3,3]})
a b
0 A 1
1 A 3
2 B 1
3 B 2
4 B 3
5 C 1
6 C 3
7 C 3
我想创建一个新的DataFrame,其中只显示a列中在b列中具有值1和2的组,即:
a b
0 B 1
1 B 2
2 B 3
我知道我们可以使用df.groupby('a'(创建组,df.all((方法似乎与此有关,但我自己无法理解。看起来应该直截了当。有什么帮助吗?
使用GroupBy.filter
+Series.any
:
new_df=df.groupby('a').filter(lambda x: x.b.eq(2).any() & x.b.eq(1).any())
print(new_df)
a b
2 B 1
3 B 2
4 B 3
我们也可以使用:
new_df=df[df.groupby('a').transform(lambda x: x.eq(1).any() & x.eq(2).any()).b]
print(new_df)
a b
2 B 1
3 B 2
4 B 3
另一种方法:
s = (pd.DataFrame(df['b'].values == np.array([[1],[2]])).T
.groupby(df['a'])
.transform('any')
.all(1)
)
df[s]
输出:
a b
2 B 1
3 B 2
4 B 3