我有一个非传统的DataFrame(从csv读入)。它看起来像这样:
SubjAns a1 a2 demog
S1A1 "1,2,3" "4,6" A
S1A2 "101,1" NaN B
对于每个单元格,我首先需要将字符串转换为浮点数列表(有没有办法让pandas将其作为浮点数列表而不是字符串读取?)然后我想创建由平均值和标准差组成的新DataFrame:
SubjAns a1_mean a1_stdev a2_mean a2_stdev demog
S1A1 3.0 1 5.0 1.41 A
S1A2 51.0 70.71 NaN NaN B
这可能吗?我最终会把它读成scikit-learn,所以如果有任何方法更适合,请加入。
答案 0 :(得分:4)
一种方法是编写一个迷你parse-then-stat函数
In [270]: df
Out[270]:
SubjAns a1 a2 demog
0 S1A1 1,2,3 4,6 A
1 S1A2 101,1 NaN B
这样,创建一个浮点列表,然后是numpy数组并返回mean和std
In [271]: def split_stat(x):
.....: x = pd.np.array(list(map(float, str(x).split(','))))
.....: return x.mean(), x.std()
.....:
然后,您可以对感兴趣的列进行迭代,在本例中为a1,a2,然后将结果压缩回新列。
In [272]: for col in ['a1', 'a2']:
.....: df[col+'_mean'], df[col+'_std'] = zip(*df[col].apply(split_stat))
.....:
并且输出看起来像
In [273]: df
Out[273]:
SubjAns a1 a2 demog a1_mean a1_std a2_mean a2_std
0 S1A1 1,2,3 4,6 A 2 0.816497 5 1
1 S1A2 101,1 NaN B 51 50.000000 NaN NaN