首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多列(n-长)的Python平坦的Dataframe

具有多列(n-长)的Python平坦的Dataframe
EN

Stack Overflow用户
提问于 2015-12-30 01:32:20
回答 2查看 222关注 0票数 1

我希望平平一个DataFrame,其中有多个列组(下面是:['a', 'b', 'c']),每个n列都很长(下面是: n=2)。也有停滞的数据,不需要被夷为平地(下面是“Misc”,“年份”)。下面是一个示例DataFrame

代码语言:javascript
复制
df = pd.DataFrame({
'Misc': ['A', 'R', 'B'],
'Year': [1991, 1992, 1993],
'a1': [10, 20, 30],
'a2': [40, 50, 60],
'b1': ['h', 'i', 'j'],
'b2': ['k', 'l', 'm'],
'c1': [4.1, 4.2, 4.3],
'c2': [4.4, 4.5, 4.6] })

产生以下情况:

代码语言:javascript
复制
In [244]: df
Out[244]:
  Misc  Year  a1  a2 b1 b2   c1   c2
0    A  1991  10  40  h  k  4.1  4.4
1    R  1992  20  50  i  l  4.2  4.5
2    B  1993  30  60  j  m  4.3  4.6

我想要的输出是:

代码语言:javascript
复制
In [4]: df1
Out[4]:
  Misc  Year   a  b    c
0    A  1991  10  h  4.1
1    A  1991  40  k  4.4
2    R  1992  20  i  4.2
3    R  1992  50  l  4.5
4    B  1993  30  j  4.3
5    B  1993  60  m  4.6

因此,[ai, bi, ci]移动到一个单一的row,同时保持Misc,年。我正在处理成千上万的20,000行数据集,因此性能是一个大问题。目前,我正在循环每一行来分离它们,但是我希望有一个更好的python函数来进行扁平化。我见过熊猫的“融化”功能,但它似乎只有在只有一个群体的情况下才能发挥作用。

最终,我希望创建一个助手函数,它将接受任意数量的“组”列、“停滞”列和“n”值。

我目前正在使用熊猫,但也对其他解决方案持开放态度。谢谢你的帮助!)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-30 02:41:51

这个怎么样:

代码语言:javascript
复制
In [11]: df1 = df[["Misc", "Year"] + [c for c in df.columns if c[-1] == "1"]]

In [12]: df1 = df1.rename(columns=lambda x: x[:-1] if x[-1] == "1" else x)

In [13]: df1
Out[13]:
  Misc  Year   a  b    c
0    A  1991  10  h  4.1
1    R  1992  20  i  4.2
2    B  1993  30  j  4.3

In [14]: df2 = df[["Misc", "Year"] + [c for c in df.columns if c[-1] == "2"]]

In [15]: df2 = df2.rename(columns=lambda x: x[:-1] if x[-1] == "2" else x)

In [16]: pd.concat([df1, df2])
Out[16]:
  Misc  Year   a  b    c
0    A  1991  10  h  4.1
1    R  1992  20  i  4.2
2    B  1993  30  j  4.3
0    A  1991  40  k  4.4
1    R  1992  50  l  4.5
2    B  1993  60  m  4.6

您可以将此作为一种理解或功能,更一般地说:

代码语言:javascript
复制
In [21]: pd.concat([df[["Misc", "Year"] + [c for c in df.columns if c[-1] == str(i)]]
                     .rename(columns=lambda x: x[:-1] if x[-1] == str(i) else x)
                    for i in range(1, 3)])
Out[21]:
  Misc  Year   a  b    c
0    A  1991  10  h  4.1
1    R  1992  20  i  4.2
2    B  1993  30  j  4.3
0    A  1991  40  k  4.4
1    R  1992  50  l  4.5
2    B  1993  60  m  4.6

如果您想要获得更多的性能,您将希望在numpy中执行此操作,然后重复索引(尽管我不认为它值得获得这样的小收益)。

票数 0
EN

Stack Overflow用户

发布于 2015-12-30 01:51:51

这不是重塑/熔融类型函数的典型应用程序,所以您可能需要自己滚动。如果(# groups)*n不太大,下面的解决方案应该具有相对的性能:

创建两个数据文件,一个使用[Misc, Year, a1, b1, c1]列,另一个使用[Misc, Year, a2, b2, c2]并垂直连接它们。

对于任意数量的组和n个值,这是自动化的,前提是列名具有一个统一的约定,如您的示例中的<letter><number>。您必须对列名做一些regex解析,以确定哪些列在每个数据帧中一起使用。

为所有这些数据创建一个名为subframes的列表,并将它们与pd.concat(subframes)连接起来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34521703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档