来自某些列值的所有可能组合的pandas系列

时间:2019-02-20 16:00:23

标签: python pandas

我有一个这样的熊猫DataFrame

  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

,我想据此推断各种Series,以将“ 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之类的东西?

2 个答案:

答案 0 :(得分:1)

您可以使用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()

答案 1 :(得分:1)

您可能需要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'])