Python Pandas:按列名

时间:2015-09-08 15:09:44

标签: python pandas multiple-columns

所以我有一个[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中有没有更好的(在编码和内存效率方面)这样做而不是浪费内存来创建列表+循环通过它?有一个单线解决方案会很棒!

非常感谢提前!

3 个答案:

答案 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