Pandas:在csv文件中展平重复/包装列

时间:2014-01-25 13:31:05

标签: csv pandas

通常情况下,数据将通过包装列提供给您。例如,考虑一下:

    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文件时,我们最终会找到CCYDecimalsCCY.1Decimals.1等列。groupby操作会返回一个集合数据帧:

<pandas.core.groupby.DataFrameGroupBy object at 0x3a52b10>

然后我们将使用numpy功能展平。因此,我们将具有重复列的DataFrames转换为Series,然后将它们合并到结果DF中。

然而,这不起作用。我已尝试将不同的keys参数传递给groupBy,但它总是抱怨无法重新索引非唯一列。

有许多现有问题涉及展平列组(例如"Flattening" output of group.nth in Pandas),但我找不到任何这样做以重复列。

1 个答案:

答案 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]

然后排序。