通常情况下,数据将通过包装列提供给您。例如,考虑一下:
CCY Decimals CCY Decimals CCY Decimals
AUD/CAD 5 EUR/CZK 4 GBP/NOK 5
AUD/CHF 5 EUR/DKK 5 GBP/NZD 5
AUD/DKK 5 EUR/GBP 5 GBP/PLN 5
AUD/JPY 3 EUR/HKD 5 GBP/SEK 5
AUD/NOK 5 EUR/HUF 3 GBP/SGD 5
...
哪个应该被解析为两个列(CCY和Decimals)的数据帧,而不是六个。我的问题是,实现这一目标最常用的方式是什么?
我本想要的东西如下:
data = pd.read_csv("file.csv")
data.groupby(axis=1,by=data.columns.map(lambda s: s.replace("\..",""))).\
apply(lambda df : df.values.flatten())
在阅读csv文件时,我们最终会找到CCY
,Decimals
,CCY.1
,Decimals.1
等列。groupby
操作会返回一个集合数据帧:
<pandas.core.groupby.DataFrameGroupBy object at 0x3a52b10>
然后我们将使用numpy功能展平。因此,我们将具有重复列的DataFrames转换为Series,然后将它们合并到结果DF中。
然而,这不起作用。我已尝试将不同的keys
参数传递给groupBy
,但它总是抱怨无法重新索引非唯一列。
有许多现有问题涉及展平列组(例如"Flattening" output of group.nth in Pandas),但我找不到任何这样做以重复列。
答案 0 :(得分:3)
要使用groupby
,我会这样做:
>>> groups = df.groupby(axis=1,by=lambda x: x.rsplit(".",1)[0])
>>> pd.DataFrame({k: v.values.flat for k,v in groups})
CCY Decimals
0 AUD/CAD 5
1 EUR/CZK 4
2 GBP/NOK 5
3 AUD/CHF 5
4 EUR/DKK 5
5 GBP/NZD 5
6 AUD/DKK 5
7 EUR/GBP 5
8 GBP/PLN 5
9 AUD/JPY 3
10 EUR/HKD 5
11 GBP/SEK 5
12 AUD/NOK 5
13 EUR/HUF 3
14 GBP/SGD 5
[15 rows x 2 columns]
然后排序。