如何使用.loc将函数应用于切片列?

时间:2018-03-28 15:28:11

标签: python pandas dataframe apply

我有一个pd数据框,整数显示为字符串:

void power_set(int set1[], int set1_length) {
    int power = pow(2,set1_length);

    cout << "{";
    for (int i = 0; i < power; i++) {
        cout << "{";
        for (int j = 0; j < set1_length; j++ ) {
            if(i & (1<<j)) {
                cout << set1[j];
                if (j < set1_length - 1) cout << ",";
            }
        }
        cout << "}";
        if (i != power - 1)cout << ",";
    }
    cout << "}";
}

这给了我一个数据帧:

frame = pd.DataFrame(np.random.randn(4, 3), columns=list('ABC'), index=['1', '2', '3', '4'])
frame = frame.apply(lambda x: x.astype(str))

如果我输入frame.type(),我会得到对象。 现在我想将列[&#39; B&#39;:&#39; C&#39;]转换为数字。

想象一下,我有几十列,因此我想切片。 所以我所做的是:

     A      B      C
1 -0.890  0.162  0.477
2 -1.403  0.160 -0.570
3 -1.062 -0.577 -0.370
4  1.142  0.072 -1.732

如果我只想改变列,比如B,我会输入:

frame.loc[:,'B':'C'] = frame.loc[:,'B':'C'].apply(lambda x: pd.to_numeric(x, errors='coerce')

然后将B转换为float64但如果我将它与.loc一起使用,那么在调用DataFrame.info()后没有任何反应!

有人能帮助我吗?当然,我可以输入所有列,但我希望得到更实用的方法

2 个答案:

答案 0 :(得分:3)

您可以按如下方式生成列列表:

In [96]: cols = frame.columns.to_series().loc['B':'C'].tolist()

并使用此变量选择“感兴趣的列”:

In [97]: frame[cols] = frame[cols].apply(lambda x: pd.to_numeric(x, errors='coerce'))

In [98]: frame.dtypes
Out[98]:
A     object
B    float64
C    float64
dtype: object

答案 1 :(得分:2)

您可以将kwargs传递给apply

符合assign

frame.assign(**frame.loc[:, 'B':'C'].apply(pd.to_numeric, errors='coerce'))

                 A         B         C
1   -1.50629471392 -0.578600  1.651437
2   -2.42667924339 -0.428913  1.265936
3  -0.866740402265 -0.678886 -0.094709
4    1.49138962612 -0.638902 -0.443982

update

到位
frame.update(frame.loc[:, 'B':'C'].apply(pd.to_numeric, errors='coerce'))
frame

                 A         B         C
1   -1.50629471392 -0.578600  1.651437
2   -2.42667924339 -0.428913  1.265936
3  -0.866740402265 -0.678886 -0.094709
4    1.49138962612 -0.638902 -0.443982