Skip to main content
 首页 » 编程设计

python之如何用两组变量拆散 Pandas 数据框

2025年05月04日32cloudgamer

我有一张看起来像这样的 table 。从 CSV 文件中读取,因此没有级别、没有花哨的索引等。

ID  date1      amount1    date2        amount2 
x   15/1/2015   100        15/1/2016   80 

我的实际文件是最新的 5 和数量 5。 我如何将其转换为:

ID  date       amount 
x   15/1/2015  100 
x   15/1/2016   80 

如果我只有一个变量,我会使用 pandas.melt(),但如果有两个变量,我真的不知道如何快速完成。

我可以手动导出到内存中的 sqlite3 数据库,然后进行合并。在 pandas 中做联合更烦人,因为与 SQL 不同,它要求所有字段名称都相同,所以在 pandas 中我必须创建一个临时数据框并重命名所有字段:date1 和 amount1 的数据框,重命名字段设置为日期和金额,然后对所有其他事件执行相同的操作,然后我才能执行 pandas.concat。

有什么建议吗?谢谢!

请您参考如下方法:

这是一种方法:

>>> pandas.concat( 
...     [pandas.melt(x, id_vars='ID', value_vars=x.columns[1::2].tolist(), value_name='date'), 
...      pandas.melt(x, value_vars=x.columns[2::2].tolist(), value_name='amount') 
...     ], 
...     axis=1 
... ).drop('variable', axis=1) 
  ID       date  amount 
0  x  15/1/2015     100 
1  x  15/1/2016      80 

想法是进行两次熔化,每组列一次熔化,然后将它们连接起来。这假设这两种列是交替排列的,以便 columns[1::2] 和 columns[2::2] 正确选择它们。如果没有,您必须修改它的那部分以选择您想要的列。

您也可以使用鲜为人知的 lreshape 来实现:

>>> pandas.lreshape(x, {'date': x.columns[1::2], 'amount': x.columns[2::2]}) 
  ID       date  amount 
0  x  15/1/2015     100 
1  x  15/1/2016      80 

但是,lreshape 并没有真正的文档记录,也不清楚是否应该使用它。