熊猫中的行满足某些条件,将条件条件的值分配给一个单元格

时间:2019-01-31 21:23:18

标签: python pandas dataframe conditional-statements data-science

我有一个带有某些值的数据框。

假设这确实是某些商店的值,并且商店确实可以满足某些条件并为其提供多个“ 状态”,但是其他商店只能满足一个条件并且仅被分配一种“ 状态”。

例如:

df = DataFrame({'one':[1,2,3,4],
                'two';[5,6,7,8],
                'three':[9,10,11,12]}

这是我的条件:

df.loc[(df.one >= 1) & (df.two <= 7),'State'] = 1
df.loc[(df.one == 1) & (df.two <= 11),'State'] = 2

三行满足第一个条件,但只有一行满足第二个条件。

满足两个条件的行应在列' State '中具有状态1和2。

一个明显的问题是,当第一个条件得到分配时,DataFrame如下所示:

    one two three   State
0   1   5   9        1.0
1   2   6   10       1.0
2   3   7   11       1.0
3   4   8   12       NaN

当第二个条件得到分配时,数据框如下所示:

    one two three   State
0   1   5   9        2.0
1   2   6   10       1.0
2   3   7   11       1.0
3   4   8   12       NaN

我想要这样的东西:

    one two three   State
0   1   5   9        [1.0,2.0]
1   2   6   10       1.0
2   3   7   11       1.0
3   4   8   12       NaN

在这里我使用了一个列表,但这就是想法。

然后,如果我在单元格中进行存储,该如何称呼它们,以及如何使用“ 状态”列中具有多个值的单元格来处理依赖于该条件的其他条件专栏?

我很感激

1 个答案:

答案 0 :(得分:1)

这是一个棘手的问题,我不建议您将数据类型混入一列,因为您显示第一个单元格是类型列表,1和2是int类型,最后一个是NaN(被认为是float) ),在这种情况下,为什么不让它们全部列出

s1=(df.one >= 1) & (df.two <= 7)
s2=(df.one == 1) & (df.two <= 11)
l=[[ z for z in [x,y] if z != 0]for x , y in zip(s1*1,s2*2)]
df['State']=l
df
Out[21]: 
   one  two  three   State
0    1    5      9  [1, 2]
1    2    6     10     [1]
2    3    7     11     [1]
3    4    8     12      []