我有一个非常大的熊猫数据集,其数据长这样:
在这里,您可以看到对于每个唯一的
很不幸,这对于我非常大的数据集来说速度非常慢。你有什么方法可以提高这里的速度吗?我在考虑使用 `fillna`,但似乎需要应用两次 (`ffill` 和 `bfill`) ... 有什么想法吗?
更新:下面由 `ajcr` 提出的非常有效的解决方案是否适用于由几列定义的组?在这种情况下,`map` 不起作用。也许是 `merge`?
df = pd.DataFrame({'group1' : ['A', 'A', 'A', 'A',
'B', 'B', 'B', 'B'],
'group2' : ['C', 'C', 'C', 'D',
'E', 'E', 'F', 'F'],
'B' : ['one', np.NaN, np.NaN, np.NaN,
np.NaN, 'two', np.NaN, np.NaN],
'C' : [np.NaN, 1, np.NaN, np.NaN,
np.NaN, np.NaN, np.NaN, 4]})
df
Out[64]:
B C group1 group2
0 one NaN A C
1 NaN 1 A C
2 NaN NaN A C
3 NaN NaN A D
4 NaN NaN B E
5 two NaN B E
6 NaN NaN B F
7 NaN 4 B F
在这里,您可以看到对于每个唯一的
group1
和 group2
的组合,列 B
和 C
最多包含一个非缺失变量。
在每个 groupby(['group1','group2'])
组中,如果该值存在,则使用该组中唯一的非缺失值替换所有缺失值。
为此,我使用了 groupby
后可用的 first
函数,该函数将B或C中的第一个非缺失值传播到该组中其余缺失值的位置:df[['B','C']]=df.groupby(['group1','group2']).transform('first')
df
Out[62]:
B C group1 group2
0 one 1 A C
1 one 1 A C
2 one 1 A C
3 NaN NaN A D
4 two NaN B E
5 two NaN B E
6 NaN 4 B F
7 NaN 4 B F
很不幸,这对于我非常大的数据集来说速度非常慢。你有什么方法可以提高这里的速度吗?我在考虑使用 `fillna`,但似乎需要应用两次 (`ffill` 和 `bfill`) ... 有什么想法吗?
更新:下面由 `ajcr` 提出的非常有效的解决方案是否适用于由几列定义的组?在这种情况下,`map` 不起作用。也许是 `merge`?
a[['B','C']] = a.apply(lambda x: g.loc[x.group, ['B','C']], axis=1)
的方法,但速度要慢得多。因此,我赞同您的解决方案。 +1票 - MaxU - stand with Ukrainemap
函数沿着列中的值进行查找,并在 Series 或字典中查找它们(或应用函数),并将该值替换为返回的值。在这种情况下,我们使用df['group'].map(g['B'])
来创建一个新列,通过在 groupby DataFrameg
中替换组值为相应的值。 - Alex Rileytransform
在这里对DataFrame的速度明显较慢。@Noobie:我认为Jeff建议的解决方案最好地回答了您更新的问题。 - Alex Riley