我希望展示DataFrame
,其中有多个组(下面是['a', 'b', 'c']
)列,每列长(下面:n = 2)。还有一些停滞不前的数据不需要展平(下图:[' Misc','年'])。以下是DataFrame
示例:
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] })
产生以下内容:
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
我希望输出为:
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,Year]。我正在使用数千个20,000行数据集,因此性能是一个大问题。我目前正在每行循环来分隔它们,但是希望有一个更好的python函数来展平。我见过熊猫的融化'功能,但它似乎只有一个组有效。
最终我想创建一个辅助函数,它可以接受任意数量的'组'列,停滞不前的'列和' n'的值。
我目前正在使用熊猫,但我也对其他解决方案持开放态度。谢谢您的帮助! :)
答案 0 :(得分:0)
这不是重塑/融化类型函数的典型应用程序,因此您可能不得不自己动手。如果(# groups)*n
不是太大,这是一个相对高效的解决方案:
制作两个数据框,一个包含[Misc, Year, a1, b1, c1]
列,另一个包含[Misc, Year, a2, b2, c2]
,并垂直连接它们。
这可以针对任意数量的组和n值自动执行,前提是列名称具有统一约定,如示例中的<letter><number>
。您必须对列名进行一些正则表达式解析,以确定每个数据帧中哪些列组合在一起。
制作一个名为subframes
的所有这些数据框的列表,并将它们与pd.concat(subframes)
连接在一起。
答案 1 :(得分:0)
这是怎么回事:
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
你可以更普遍地将其作为一种理解或功能:
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中做这个concat,然后重复索引(虽然我不相信它值得给你带来的小收益)。