我当前的DF看起来像这样
Combinations Count
1 ('IDLY', 'VADA') 3734
6 ('DOSA', 'IDLY') 2020
9 ('CHAPPATHI', 'DOSA') 1297
10 ('IDLY', 'POORI') 1297
11 ('COFFEE', 'TEA') 1179
13 ('DOSA', 'VADA') 1141
15 ('CHAPPATHI', 'IDLY') 1070
16 ('COFFEE', 'SAMOSA') 1061
17 ('COFFEE', 'IDLY') 1016
18 ('POORI', 'VADA') 1008
假设我从上面的数据框中按关键字“ DOSA”进行过滤,得到下面的OP
Combinations Count
6 ('DOSA', 'IDLY') 2020
9 ('CHAPPATHI', 'DOSA') 1297
13 ('DOSA', 'VADA') 1141
但是我希望输出类似于下面的df(它忽略了过滤关键字,因为它很常见,
Combinations Count
6 IDLY 2020
9 CHAPPATHI 1297
13 VADA 1141
这里需要使用什么概念的熊猫?如何实现?
答案 0 :(得分:1)
您还可以尝试创建一个数据框作为参考,然后在关键字与docker run --rm --mount type=bind,source=$(pwd),target=/pipeline/project -e RUN_UID=$(id -u) -e RUN_GID=$(id -g) pipelineimage:v1
匹配的地方屏蔽掉NaN:
stack
keyword = 'DOSA'
m = pd.DataFrame(df['Combinations'].tolist(),index=df.index)
c = m.eq(keyword).any(1)
df[m.eq(keyword).any(1)].assign(Combinations=
m[c].where(m[c].ne(keyword)).stack().droplevel(1))
对于字符串类型,您可以通过以下方式将其转换为元组:
Combinations Count
6 IDLY 2020
9 CHAPPATHI 1297
13 VADA 1141
答案 1 :(得分:1)
通常,在数据帧中包含list, tuples, sets,
等并不理想。最好在需要时为每个实例具有多个记录。
您可以使用explode
将Combinations
转换为此表格并对其进行过滤
keyword = 'DOSA'
s = df.explode('Combinations')
s.loc[s.Combinations.eq('keyword').groupby(level=0).transform('any') & s.Combinations.ne('keyword')]
或将两个命令与.loc[lambda ]
链接:
(df.explode('Combinations')
.loc[lambda x: x.Combinations.ne(keyword) &
x.Combinations.eq(keyword).groupby(level=0).transform('any')]
)
输出:
Combinations Count
6 IDLY 2020
9 CHAPPATHI 1297
13 VADA 1141
答案 2 :(得分:1)
我会做什么
x=df.explode('Combinations')
x=x.loc[x.index[x.Combinations=='DOSA']].query('Combinations !="DOSA"')
x
Combinations Count
6 IDLY 2020
9 CHAPPATHI 1297
13 VADA 1141
答案 3 :(得分:0)
d = df[df['Combinations'].transform(lambda x: 'DOSA' in x)].copy()
d['Combinations'] = d['Combinations'].apply(lambda x: set(x).difference(['DOSA']).pop())
print(d)
打印:
ID Combinations Count
1 6 IDLY 2020
2 9 CHAPPATHI 1297
5 13 VADA 1141