【问题标题】:Pandas distribute values of list element of a column into n different columnsPandas 将列的列表元素的值分配到 n 个不同的列中
【发布时间】:2018-11-21 09:34:23
【问题描述】:

我有一个 Pandas DataFrame,其中包含一个列名 RecentDelays,其中包含一个元素列表。 My DataFrame

需要将此RecentDelays列分成N个不同的列,例如Delay1,Delay2,....列表的第一个值在对应行的Delay1列中,第二个值在对应行的Delay2列中等等。如果有没有第 n 个值应该是 NaN

【问题讨论】:

  • 您能否添加一个输入数据样本?
  • 请将您的数据框发布为文本,而不是图像。
  • RecentDelays [23,47] [] [24,43,87]

标签: python pandas data-science data-cleaning


【解决方案1】:

对于新列最好使用DataFrame 构造函数,因为.apply(pd.Series) 很慢,检查this timings,最后join 为原始:

#jedwards data sample
d1 = pd.DataFrame({'Airline':['A','B','C'],'Delays':[[],[1],[1,2]]})

d2 = (pd.DataFrame(d1['Delays'].values.tolist(), index=d1.index)
        .rename(columns = lambda x: 'Delay{}'.format(x+1)))

df = d1.join(d2)
print (df)
  Airline  Delays  Delay1  Delay2
0       A      []     NaN     NaN
1       B     [1]     1.0     NaN
2       C  [1, 2]     1.0     2.0

如果需要删除列,请先使用pop

d2 = (pd.DataFrame(d1.pop('Delays').values.tolist(), index=d1.index)
        .rename(columns = lambda x: 'Delay{}'.format(x+1)))

df = d1.join(d2)
print (df)
  Airline  Delay1  Delay2
0       A     NaN     NaN
1       B     1.0     NaN
2       C     1.0     2.0

【讨论】:

    【解决方案2】:

    这是一种方法:

    import pandas as pd
    
    d1 = pd.DataFrame({'Airline':['A','B','C'],'Delays':[[],[1],[1,2]]})
    
    # Expand column into temporary Dataframe
    d2 = d1['Delays'].apply(pd.Series)
    
    # Integrate temp columns back into original Dataframe (while naming column)
    for col in d2:
        d1["Delay%d" % (col+1)] = d2[col]
    
    print(d1)
    

    之前:

    航空公司延误 0个[] 1 乙 [1] 2 C [1, 2]

    之后:

    航空公司延误 延误 1 延误 2 0 A [] 南南 1 B [1] 1.0 NaN 2 C [1, 2] 1.0 2.0

    您还可以将临时数据框中的列命名为:

    # Name columns of new dataframe
    d2.columns = ["Delay%d" % (i+1) for i in range(len(d2.columns))]
    

    然后使用 concat。

    您还可以使用以下内容删除现已扩展的延迟列:

    d1.drop(columns=['Delays'], inplace=True) # or,
    d1.drop(['Delays'], axis=1, inplace=True)
    

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 2019-01-14
      • 2019-08-31
      • 2023-02-10
      • 2020-06-22
      • 2020-12-29
      • 2013-04-01
      • 2012-10-04
      • 1970-01-01
      相关资源
      最近更新 更多