繁体   English   中英

将熊猫数据框的一行转换为多行

[英]Convert one row of a pandas dataframe into multiple rows

我想转这个:

   age  id  val
0   99   1  0.3
1   99   2  0.5
2   99   3  0.1

进入这个:

   age  id  val
0   25   1  0.3
1   50   1  0.3
2   75   1  0.3
3   25   2  0.5
4   50   2  0.5
5   75   2  0.5
6   25   3  0.1
7   50   3  0.1
8   75   3  0.1

上下文:我的数据存储了一个为所有年龄(年龄 = 99)编码的值。 但是,我正在为其开发的应用程序需要为每个 id-age 对(id = 1,age = 25,50 和 75)明确规定的值。 对此有简单的解决方案:遍历 id 并附加一堆数据帧,但我正在寻找一些优雅的东西。 我想做一个多:一个从我的原始数据框合并到一个包含所有年龄的模板,但我仍然需要遍历 id 来创建模板。

不知道,也许会有更优雅的方法,但是您可以执行诸如交叉联接(或笛卡尔积 )的操作:

>>> df = pd.DataFrame({'age':[99,99,99],'id':[1,2,3],'val':[0.3,0.5,0.1]})
>>> df
   age  id  val
0   99   1  0.3
1   99   2  0.5
2   99   3  0.1
>>> df2 = pd.DataFrame({'age':[99,99,99],'new_age':[25,50,75]})
>>> df2 = pd.merge(df, df2, on='age')
>>> del df2['age']
>>> df2 = df2.rename(columns={'new_age':'age'})
>>> df2
   id  val      age
0   1  0.3       25
1   1  0.3       50
2   1  0.3       75
3   2  0.5       25
4   2  0.5       50
5   2  0.5       75
6   3  0.1       25
7   3  0.1       50
8   3  0.1       75

如果 Pandas >= 1.2 版本

import pandas as pd 

pd.__version__
# '1.2.0'

left = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
right = pd.DataFrame({'col3': [5, 6]}) 

left.merge(right, how='cross')

   col1  col2  col3
0     1     3     5
1     1     3     6
2     2     4     5
3     2     4     6

如果熊猫 < 1.2

df1.assign(key=1).merge(df2.assign(key=1), on="key").drop("key", axis=1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM