我有一个这样的熊猫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
之类的东西?
答案 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'])