Pandas:将 DataFrame 转换为每个单元格的均值和标准差
Posted
技术标签:
【中文标题】Pandas:将 DataFrame 转换为每个单元格的均值和标准差【英文标题】:Pandas: Convert DataFrame to Mean and Standard Deviation of Each Cell 【发布时间】:2015-10-24 21:27:59 【问题描述】:我有一个非常规的 DataFrame(从 csv 读取)。它看起来像这样:
SubjAns a1 a2 demog
S1A1 "1,2,3" "4,6" A
S1A2 "101,1" NaN B
对于每个单元格,我首先需要将字符串转换为浮点数列表(熊猫有没有办法将其读取为浮点数列表而不是字符串?)然后我想创建一个新的由均值和标准差组成的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,所以如果有任何方法更适合它,请包含它。
【问题讨论】:
【参考方案1】:一种方法,是编写一个小型的 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 数组并返回均值和标准值
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
【讨论】:
问题是split_stat()
中的x = pd.np.array(map(float, str(x).split(',')))
似乎在创建一个地图对象,而不是一个numpy 数组。
@Adam_G:在 Python3 中,map
返回一个地图对象,而不是一个列表。所以使用x = pd.np.array(list(map(float, str(x).split(','))))
。
是的,做到了。谢谢。以上是关于Pandas:将 DataFrame 转换为每个单元格的均值和标准差的主要内容,如果未能解决你的问题,请参考以下文章
将Dask包的Pandas DataFrame转换为单个Dask DataFrame
使用形状的因子级别将 pandas.DataFrame 转换为 numpy 张量 [重复]
将 Pandas tseries 对象转换为 DataFrame