所以我有一个[Python2.7] Pandas数据帧(df)如下:
name flag dummy_D random ID dummy_S dummy_T
0 Mick Purple 2 NaN 1 21 32
1 John Red NaN NaN 2 w32 4
2 Christine NaN 2 NaN 2 w33 3
3 Stevie NaN 4 NaN 2 w34 2
4 Lindsey NaN 5 NaN 2 w35 NaN
我想替换列中的所有NaN,并使用' dummy'使用以前的值(只有这些列,而其余的数据框保持不变)
这是我做的:
dummycol = [col for col in df.columns if 'dummy' in col]
for d in dummycol:
df[d] = df[d].fillna(method = 'pad')
我的问题是:
在Pandas中有没有更好的(在编码和内存效率方面)这样做而不是浪费内存来创建列表+循环通过它?有一个单线解决方案会很棒!
非常感谢提前!
将
答案 0 :(得分:2)
您可以这样做,因此您可以在列上调用str.startswith
以获取感兴趣的列,然后同时在所有这些列上调用fillna
:
In [152]:
cols = df.columns[df.columns.str.startswith('dummy')]
df[cols] = df[cols].fillna(method='pad')
df
Out[152]:
name flag dummy_D random ID dummy_S dummy_T
0 Mick Purple 2 NaN 1 21 32
1 John Red 2 NaN 2 w32 4
2 Christine NaN 2 NaN 2 w33 3
3 Stevie NaN 4 NaN 2 w34 2
4 Lindsey NaN 5 NaN 2 w35 2
答案 1 :(得分:0)
这可以避免列表理解,只会在列上循环一次:
for d in df.columns:
df[d] = df[d].fillna(method = 'pad') if 'dummy' in d
答案 2 :(得分:0)
您可以将条件列表理解与.loc
一起使用:
_ = [df.loc[:, col].fillna(method='ffill', inplace=True) for col in df if col[:5] == 'dummy']
>>> df
name flag dummy_D random ID dummy_S dummy_T
0 Mick Purple 2 NaN 1 21 32
1 John Red 2 NaN 2 w32 4
2 Christine NaN 2 NaN 2 w33 3
3 Stevie NaN 4 NaN 2 w34 2
4 Lindsey NaN 5 NaN 2 w35 2