如何根据条件从DF创建DF

时间:2020-06-01 17:01:53

标签: python pandas

我当前的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

这里需要使用什么概念的熊猫?如何实现?

4 个答案:

答案 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,等并不理想。最好在需要时为每个实例具有多个记录。

您可以使用explodeCombinations转换为此表格并对其进行过滤

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