【问题标题】:How to split a column value at comma into multiple columns and rename them as its number of column as suffix如何将逗号处的列值拆分为多个列并将它们重命名为其列数作为后缀
【发布时间】:2021-12-19 17:06:46
【问题描述】:

我正在使用 python,并且我有一个名为“noshow”的数据框,其中包含 5 列,例如,

  1. 电话 - float64
  2. 名称 - 对象
  3. 订单总数 - int64
  4. 账单总额 - float64
  5. List_of_Order_Id - 对象

第 5 列“List_of_Order_Id”包含每行(客户)的订单 ID 列表,如下所示,

In [11]: noshow
Out[11]: 
           Mobile  ...                  List_of_Order_Id
0    9.163820e+08  ...                             21810
1    9.179049e+08  ...                             23387
2    9.183748e+08  ...                             21767
3    9.186110e+08  ...                             23457
4    9.187790e+08  ...                       23117,23163
..            ...  ...                               ...
353  9.970647e+09  ...                             21549
354  9.971940e+09  ...                             22753
355  9.994742e+09  ...     21505,21836,22291,22539,22734
356  9.994964e+09  ...                             22348
357  9.994997e+09  ...                       21100,21550

[358 rows x 5 columns]

现在,我想在每个逗号处自动拆分“List_of_Order_Id”列,并使用循环或任何可用的解决方案为每个值创建一个新列。

例如,如果在 358 行中 List_of_Order_Id 列的其中一行具有“n”个订单 ID 值,这就是每个客户的最大订单 ID 数 然后我想将其拆分为“n”列,并将每一列命名为 “Order_Id_1”、“Order_Id_2”、.......、“Order_Id_n " 后缀为数字。

请帮忙! 提前致谢。

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

您可以使用str.split 拆分列中的字符串,然后将生成的DataFrame 附加到原始DataFrame,使用其宽度分配列名。

temp = df['List_of_Order_Id'].str.split(',', expand=True).applymap(lambda x: np.nan if x is None else x)
df[['Order_Id_'+str(i) for i in range(1,temp.shape[1] + 1)]] = temp

           Mobile  ...               List_of_Order_Id Order_Id_1 Order_Id_2  \
0    9.163820e+08  ...                          21810      21810        NaN   
1    9.179049e+08  ...                          23387      23387        NaN   
2    9.183748e+08  ...                          21767      21767        NaN   
3    9.186110e+08  ...                          23457      23457        NaN   
4    9.187790e+08  ...                    23117,23163      23117      23163   
..            ...  ...                            ...        ...        NaN   
353  9.970647e+09  ...                          21549      21549        NaN   
354  9.971940e+09  ...                          22753      22753        NaN   
355  9.994742e+09  ...  21505,21836,22291,22539,22734      21505      21836   
356  9.994964e+09  ...                          22348      22348        NaN   
357  9.994997e+09  ...                    21100,21550      21100      21550   

    Order_Id_3 Order_Id_4 Order_Id_5  
0          NaN        NaN        NaN  
1          NaN        NaN        NaN  
2          NaN        NaN        NaN  
3          NaN        NaN        NaN  
4          NaN        NaN        NaN  
..         NaN        NaN        NaN  
353        NaN        NaN        NaN  
354        NaN        NaN        NaN  
355      22291      22539      22734  
356        NaN        NaN        NaN  
357        NaN        NaN        NaN  

【讨论】:

  • 非常感谢!假设我有一个名为“List_of_Bill_Value”的第 6 列,其格式与“List_of_Order_Id”相同,并且我使用您提供的相同代码来拆分此列并将它们重命名为“Bill_Value_1”、“Bill_Value_2”、.. ...“Bill_Value_n”。现在,有没有像上面那样我可以自动重新排列它们,如“Order_Id_1”、“Bill_Value_1”、“Order_Id_2”、“Bill_Value_2”、.......“Order_Id_n”、“Bill_Value_n”。它会真的很有帮助,请给我一个解决方案。
  • @NaveenV 您可以将它们重新排列为df = df[['Mobile']+[col for i in range(1, temp.shape[1]+1) for col in df.columns if str(i) in col]]
  • 拆分后,现在我的“df”有 m 列,例如“Mobile”、“Name”、“Total Order Counts”、“Total Bill Value”、“List_of_Order_Id” '、'List_of_Bill_Value'、n 个连续的“Order_Id”列和 n 个连续的“Bill_Value”列。我使用变量“temp”来拆分“List_of_Order_Id”,并使用变量“temp1”来拆分“List_of_Bill_Value”。根据您上面的代码,我应该在“temp”的位置放置哪个(temp 或 temp1)?上面的代码会产生重​​复的列,并且重新排列不正确。请建议
  • 您创建temptemp1,分配df[['Order_Id_'+str(i) for i in range(1,temp.shape[1] + 1)]] = tempdf[['Bill_Value_'+str(i) for i in range(1,temp1.shape[1] + 1)]] = temp1。然后将列重新排列为df = df[["Mobile", 'Name', 'Total Order Counts', 'Total Bill Value']+[col for i in range(1, temp.shape[1]+1) for col in df.columns if str(i) in col]]
  • ` Column Non-Null Count Dtype --- ------ -------------- ----- 0 Mobile 1 Name 2 Total Order计数3总票据值4 ourder_id_1 5 ourder_id_10 6 ourder_id_12 8 ourder_id_13 9 ourder_id_14 ... upto order_116 mill_value_10 17 bill_value_12 19 bill_value_13 20 bill_value_14 ... upto bill_value_19 26 ordo_id_2 27 order_12 28 bill_value_2 29 bill_value_12 30 order_id_3 31 Order_Id_13 32 Bill_Value_3 33 Bill_Value_13 到 19
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 2016-10-02
  • 2012-01-24
  • 1970-01-01
  • 2012-05-21
  • 2018-11-11
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多