首页 > 解决方案 > 如何将公式应用于 Dataframe 熊猫中的所有列

问题描述

我有以下数据框:

import pandas as pd
data = {'MA1': [ float("nan"),  float("nan"),      -1,   1],
        'MA2': [ float("nan"),            -1,       0,   0],
        'MA3': [            0,             0,       1,  -1]}
df_input = pd.DataFrame(data, columns=['MA1', 'MA2', 'MA3'])

在此处输入图像描述

我的目标是对于每一列,如果第一个非 nan 和非零值是 -1,则将其设置为 0。

澄清:

如果第一个非 0 和非 nan 值为 -1,则目标仅设置为 0。如果它是 1 或其他任何值,则将其留在那里。

在此处输入图像描述

最快的方法是什么?

标签: pythonpandas

解决方案


DataFrame.loc当第一个有效值为 时,您可以遍历列并使用分配 0 -1

dft = df_input.replace(0, np.NaN)

for col in df_input.columns:
    idxmin = dft[col].idxmin()
    if df_input.loc[idxmin, col] == -1:
        df_input.loc[idxmin, col] = 0

   MA1  MA2  MA3
0  NaN  NaN    0
1  NaN  0.0    0
2  0.0  0.0    1
3  1.0  0.0    0

或者通过使用来提高效率,DataFrame.idxmin这样我们就不必Series.idxmin在循环中调用每次迭代:

dft = df_input.replace(0, np.NaN).idxmin()

for col, idx in dft.iteritems():
    if df_input.loc[idx, col] == -1:
        df_input.loc[idx, col] = 0

   MA1  MA2  MA3
0  NaN  NaN    0
1  NaN  0.0    0
2  0.0  0.0    1
3  1.0  0.0    0

推荐阅读