【发布时间】:2021-11-05 11:04:41
【问题描述】:
我有一个来自源数据的数据框,类似于以下内容:
In[1]: df = pd.DataFrame({'test_group': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'test_type': [np.nan,'memory', np.nan, np.nan, 'visual', np.nan, np.nan,
'auditory', np.nan]}
Out[1]:
test_group test_type
0 1 NaN
1 1 memory
2 1 NaN
3 2 NaN
4 2 visual
5 2 NaN
6 3 NaN
7 3 auditory
8 3 NaN
test_group 代表行的分组,代表一个测试。我需要将每个test_group 中test_type 列中的NaN 替换为不是NaN 的行的值,例如记忆力、视觉力等。
我尝试了多种方法,包括隔离test_type 中的“真实”值,例如
In [4]: df.groupby('test_group')['test_type'].unique()
Out[4]:
test_group
1 [nan, memory]
2 [nan, visual]
3 [nan, auditory]
很简单,我可以索引每一行并提取我想要的值。这似乎朝着正确的方向发展:
In [6]: df.groupby('test_group')['test_type'].unique().apply(lambda x: x[1])
Out[6]:
test_group
1 memory
2 visual
3 auditory
我尝试了很多其他方法,但效果不佳(注意:apply 和 transform 给出相同的结果):
In [15]: grp = df.groupby('test_group')
In [16]: df['test_type'] = grp['test_type'].unique().transform(lambda x: x[1])
In [17]: df
Out[17]:
test_group test_type
0 1 NaN
1 1 memory
2 1 visual
3 2 auditory
4 2 NaN
5 2 NaN
6 3 NaN
7 3 NaN
8 3 NaN
我敢肯定,如果我循环它,我会做的事情,但循环太慢,因为数据集是每个文件数百万条记录。
【问题讨论】:
-
df.groupby('test_group')['test_type'].bfill().ffill()?您的预期输出是什么? -
是否总是一开始,每个组只有一个有效值,而每个组中的其余值都是 NaN?
-
@It_is_Chris - 是的,这就完成了。谢谢!
-
@Ch3steR - 正确。
-
@schwim 感谢您的澄清。该不变量帮助我找到了比双填充更快的解决方案。
标签: python pandas dataframe group-by pandas-groupby