将具有可变长度的列表列展开为 pandas 数据帧的行

Expand list columns with variable length into rows of a pandas dataframe

提问人:ROHITH REDDY SUREDDY 提问时间:9/2/2022 最后编辑:ROHITH REDDY SUREDDY 更新时间:9/16/2022 访问量:237

问:

我有一个输入数据帧,其中包含多个列表列,列表中的元素数量不相等。我需要将所有列表列展开为行,以便每个 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']]}

Input_df:enter image description here

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 列也是如此。

我使用爆炸方法或类似方法遇到的几个问题是:

  1. soc_bins (5) 和 temp_bins (3) 中的箱数不相等。
  2. 此外,两个箱可能有相同的值(例如:第 3 行,soc_value包含两个值作为 9),因此当我第一次展开soc_value列时,分解功能无法将两行识别为不同,因此我收到错误“无法处理非唯一多索引!
  3. 有很多列必须以相同的方式进行操作。
  4. 可以使用,但我在索引列中得到了 NaN。 要填充 NaN,我可以使用 .ffill(),但我无法区分原始的 null 值。 此外,在此方法中,如果某些索引为 null,我会收到错误“无法处理非唯一多索引!df.set_index('date','vin','celltype').apply(lambda x: x.apply(pd.Series).stack()).reset_index()

电流输出:enter image description here

所需输出:我需要与当前输出相似的输出,但没有空值。我可以使用 .ffill() 来填充 null 值,但是我无法区分实际的 null 值与从 df.set_index() 创建的值。

python-3.x pandas list dataframe 数据操作

评论

0赞 INGl0R1AM0R1 9/2/2022
你想要的最终df是什么?

答:

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()