python - 压平并展开 csv 文件?

标签 python csv pandas flatten

目标:

我想转换以下架构:

group, id, name
A, 12345, "eeny"
A, 23456, "meeny"
A, 34567, "miney mo"
B, 99999, "foo"
B, 88888, "bar"
B, 77777, "foobar"

进入:

group, id1, name1, id2, name2, id3, name3
A, 12345, "eeny", 23456, "meeny", 34567, "miney mo"
B, 99999, "foo", 88888, "bar", 77777, "foobar" 

在 Python 环境中,我假设最好使用 Pandas groupby() 和/或 unstack() 来完成,但我遇到的大多数文档都涉及数值计算而不是字符串。

任何帮助将不胜感激。谢谢!

最佳答案

这是一种方法。添加一列表示每个组内的计数。

df['group_num'] = df.groupby('group')['id'].transform(lambda x: range(1, len(x)+1))

然后,使用pivot函数 reshape 数据。

In [37]: df.pivot(index='group', columns='group_num')
Out[37]: 
              id                name                 
group_num      1      2      3     1      2         3
group                                                
A          12345  23456  34567  eeny  meeny  miney mo
B          99999  88888  77777   foo    bar    foobar

这会将列设置为多重索引。您可以在所需的输出中显示如下所示的扁平化:

In [41]: df = df.pivot(index='group', columns='group_num')    

In [42]: df.columns = [''.join([lvl1, str(lvl2)]) for lvl1, lvl2 in df.columns]

In [43]: df
Out[43]: 
         id1    id2    id3 name1  name2     name3
group                                            
A      12345  23456  34567  eeny  meeny  miney mo
B      99999  88888  77777   foo    bar    foobar

关于python - 压平并展开 csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25856253/

相关文章:

python - django-tastypie 和 django-tastypie-mongoengine PATCH 错误

python - Python 中的纯虚方法

python - CSV 文件无法打印?

ruby-on-rails - 如何在大 CSV 出错后重试 Postgres COPY

python - 使用 Python 比较 2 个 excel 文件

python - 如何从数据框的单元格中获取值?

python - 分析图像中每个子窗口的更快方法?

python - Pandas 将列分组为级别

Python:将列表保存在不带引号的文件中?

python - Pandas 数据框 : Remove secondary upcoming same value