提问人:ROHITH REDDY SUREDDY 提问时间:9/2/2022 最后编辑:ROHITH REDDY SUREDDY 更新时间:9/16/2022 访问量:237
将具有可变长度的列表列展开为 pandas 数据帧的行
Expand list columns with variable length into rows of a pandas dataframe
问:
我有一个输入数据帧,其中包含多个列表列,列表中的元素数量不相等。我需要将所有列表列展开为行,以便每个 bin 在同一行中具有相应的值。
生成 DF 的代码:
df_dict = {'vin':['VIN123','VIN123','VIN123','VIN234','VIN345'],
'date':['01-22-2022','01-23-2022','01-23-2022','01-23-2022','01-22-2022'],
'celltype':['A','A','B','A','B'],
'soc_bins':[['0-10','10-20','50-80','85-90','100-150','150-170'],['0-10','10-20','50-80','85-90','100-150','150-170'],['0-10','10-20','50-80','85-90','100-150','150-170'],['0-10','10-20','50-80','85-90','100-150','150-170'],['0-10','10-20','50-80','85-90','100-150','150-170']],
'soc_value': [[10,300,85,20,5,0],[20,400,125,670,5,7],[20,500,55,60,9,9],[40,300,65,90,1,0],[20,700,35,50,2,0]],
'temp_bins':[['50f-55f','60f-70f','90f-110f'],['50f-55f','60f-70f','90f-110f'],['50f-55f','60f-70f','90f-110f'],['50f-55f','60f-70f','90f-110f'],['50f-55f','60f-70f','90f-110f']],
'temp_value':[[1,2,3],[4,3,4],[5,3,5],[6,900,7],[3,600,9]],
'temp_bins':[['50f-55f','60f-70f','90f-110f'],['50f-55f','60f-70f','90f-110f'],['50f-55f','60f-70f','90f-110f'],['50f-55f','60f-70f','90f-110f'],['50f-55f','60f-70f','90f-110f']]}
Output_df:
VIN | 日期 | 细胞类型 | soc_bins | soc_value | temp_bins | temp_value |
---|---|---|---|---|---|---|
VIN123系列 | 01-22-2022 | 一个 | 0-10 | 10 | 50F-55F | 1 |
VIN123系列 | 01-22-2022 | 一个 | 10-20 | 300 | 60F-70F | 2 |
简而言之,soc_value列中的每个值都对应于soc_bin列中的相应 bin,temp 列也是如此。
我使用爆炸方法或类似方法遇到的几个问题是:
- soc_bins (5) 和 temp_bins (3) 中的箱数不相等。
- 此外,两个箱可能有相同的值(例如:第 3 行,soc_value包含两个值作为 9),因此当我第一次展开soc_value列时,分解功能无法将两行识别为不同,因此我收到错误“无法处理非唯一多索引!
- 有很多列必须以相同的方式进行操作。
- 可以使用,但我在索引列中得到了 NaN。
要填充 NaN,我可以使用 .ffill(),但我无法区分原始的 null 值。
此外,在此方法中,如果某些索引为 null,我会收到错误“无法处理非唯一多索引!
df.set_index('date','vin','celltype').apply(lambda x: x.apply(pd.Series).stack()).reset_index()
所需输出:我需要与当前输出相似的输出,但没有空值。我可以使用 .ffill() 来填充 null 值,但是我无法区分实际的 null 值与从 df.set_index() 创建的值。
答:
0赞
ROHITH REDDY SUREDDY
9/16/2022
#1
在将 df 分解为列之前为其分配row_number解决了“无法处理非唯一多索引”的问题。
df['row_number'] = np.arange(len(df))
df.set_index('date','vin','celltype').apply(lambda x: x.apply(pd.Series).stack()).reset_index()
评论