python - Pandas:将 DataFrame 转换为每个单元格的均值和标准差

标签 python csv pandas scikit-learn dataframe

我有一个非常规的 DataFrame(从 csv 中读入)。它看起来像这样:

SubjAns    a1      a2     demog
S1A1       "1,2,3" "4,6"      A
S1A2       "101,1" NaN        B

对于每个单元格,我首先需要将字符串转换为 float 列表(pandas 是否有办法将其读取为 float 列表而不是字符串?)然后我想创建一个新的由均值和标准差组成的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,所以如果有任何方法更适合它,请包括它。

最佳答案

一种方法是编写一个小型的先解析后统计函数

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

关于python - Pandas:将 DataFrame 转换为每个单元格的均值和标准差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31776014/

相关文章:

python - Django - 无法添加中间件

python - 使用 Python 将结果保存到 csv 文件

Linux - 加入 2 个 CSV 文件

python - Pandas :计算第一个连续的真值

python - 具有edgeNgram过滤器的自定义分析器不起作用

python - 请求 : Explanation of the . 文本格式

python - 使用控制台让 python 在 Windows XP 上以 UTF8 打印

python - 将稀疏csv文件读入pandas

python - Pandas 合并两个数据框而不重复列

python - 将前 n 个非 NaN 单元格保留在 pandas DataFrame 的每一行中