从所有可能的特定列值组合中选择一个序列

2024-03-29 00:50:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的熊猫数据帧

  method   method_par1   variantB_option   x   y
0     m1    variantA             NaN       2  13
1     m1    variantA             NaN       1  11
2     m2         NaN             NaN       1   7
3     m2         NaN             NaN       5   3
4     m1    variantB              25      10   9
5     m1    variantB              25       5   3
6     m1    variantB              15      54  39
7     m1    variantB              15       1   4

我想从中推断出不同的系列,来绘制y列和x列的值。此系列中的每一个都应该有前3列中的值的唯一组合之一(忽略索引)

所以我想要以下数据帧

df1
  method   method_par1   variantB_option   x   y
0     m1    variantA             NaN       2  13
1     m1    variantA             NaN       1  11



df2
  method   method_par1   variantB_option   x   y
2     m2         NaN             NaN       1   7
3     m2         NaN             NaN       5   3


df3
  method   method_par1   variantB_option   x   y

4     m1    variantB              25      10   9
5     m1    variantB              25       5   3


df4  
  method   method_par1   variantB_option   x   y
6     m1    variantB              15      54  39
7     m1    variantB              15       1   4

第一列中每个列的可能值都是有限的,因此可能性的数量是有限的(但很大)

当然,我可以通过使用嵌套的for循环和df[df['method'] == 'm1']之类的连接来实现这一点,但是在我的实际(更大的)示例中,它变得非常混乱,我想知道是否有更干净的方法。也许用groupby之类的东西


Tags: 数据df绘制nanmethodoptiondf1df2
1条回答
网友
1楼 · 发布于 2024-03-29 00:50:18

您可能需要fillna

for x , y in df.fillna('NaN').groupby(['method','method_par1','variantB_option']):
    print(y)

  method method_par1 variantB_option  x   y
0     m1    variantA             NaN  2  13
1     m1    variantA             NaN  1  11
  method method_par1 variantB_option   x   y
6     m1    variantB              15  54  39
7     m1    variantB              15   1   4
  method method_par1 variantB_option   x  y
4     m1    variantB              25  10  9
5     m1    variantB              25   5  3
  method method_par1 variantB_option  x  y
2     m2         NaN             NaN  1  7
3     m2         NaN             NaN  5  3

d={ x:y.replace({'NaN':np.nan})   for x , y in df.fillna('NaN').groupby(['method','method_par1','variantB_option'])
网友
2楼 · 发布于 2024-03-29 00:50:18

您可以使用groupby并对其进行迭代:

dfs = [v for k, v in df.groupby(['method', 'method_par1', 'variantB_option'])['x', 'y']]
dfs[0]
  method method_par1 variantB_option  x   y
0     m1    variantA             NaN  2  13
1     m1    variantA             NaN  1  11
dfs[1]
  method method_par1 variantB_option   x   y
6     m1    variantB              15  54  39
7     m1    variantB              15   1   4
dfs[2]
  method method_par1 variantB_option   x  y
4     m1    variantB              25  10  9
5     m1    variantB              25   5  3
dfs[3]
  method method_par1 variantB_option  x  y
2     m2         NaN             NaN  1  7
3     m2         NaN             NaN  5  3

如果您的NaN是实而不是数字groupby将只返回不带NaN的三元组。在这种情况下,使用df.fillna()作为您的首选值

相关问题 更多 >