【问题标题】:How to split lists over a range of column?如何在列范围内拆分列表?
【发布时间】:2019-10-21 16:34:07
【问题描述】:

我有一个包含几列的数据框,其中包含一个列表。我想将此列表拆分为不同的列。我目前在 stackoverflow 中找到了this 问题,但它似乎只是将列表拆分为 1 列,我想将其应用于列表中包含不相等数量的对象的多个列。

我的 df 看起来像这样:

     ID |  value_0  |  value_1  |  value_2  | value_3   | value_4
0   1001|[1001,1002]|   None    |   None    |   None    |  None 
1   1010|[1010,2001]|[2526,1000]|   None    |   None    |  None  
2   1100|[1234,5678]|[9101,1121]|[3141,5161]|[1718,1920]|[2122,2324]

我想把它改成:

     ID | 0  | 1  |  2   |  3   | 4
0   1001|1001|1002| None | None | None 
1   1010|1010|2001| 2526 | 1000 | None  
2   1100|1234|5678| 9101 | 1121 | 3141 ....etc.

目前这是我的代码,但它只输出一个包含“无”值的数据帧。我不确定如何解决它,因为它似乎只获取最后一列,并没有真正拆分列表。

length = len(list(df.columns.values))-1

for i in range(length):
    temp = "value_" + str(i)
    x = df[temp]
    new_df = pd.DataFrame(df[temp].values.tolist())

我得到的new_df的结果是:

   | 0
  0| None
  1| None
  2| [2122,2324]

但是,如果我只关注 1 列(即 value_0),它会很好地拆分列表。

new_df = pd.DataFrame(df['value_0'].values.tolist())

非常感谢任何帮助

【问题讨论】:

    标签: python pandas list


    【解决方案1】:

    首先使用pd.concatpd.Series将列表展开为单独的列并附加到原始df,然后删除原始列

    for i in df.columns:
        df = pd.concat([df, df[i].apply(pd.Series)], axis=1)
    
    df.drop(['ID','value_0','value_1','value_2','value_3','value_4'], axis=1, inpalce=True)
    

    输出

              0     0     1       0       1       0       1       0       1  \
       0   1001  1001  1002     NaN     NaN     NaN     NaN     NaN     NaN   
       1   1010  1010  2001  2526.0  1000.0     NaN     NaN     NaN     NaN   
       2   1100  1234  5678  9101.0  1121.0  3141.0  5161.0  1718.0  1920.0   
    
               0       1  
       0     NaN     NaN  
       1     NaN     NaN  
       2  2122.0  2324.0 
    

    【讨论】:

      【解决方案2】:

      想法是通过DataFrame.stack 重塑值以删除None 值,因此可以使用DataFrame 构造函数,然后通过Series.unstack 重塑,对列进行排序并设置默认列名:

      import ast
      #if strings in columns instead lists
      #df.iloc[:, 1:] = df.iloc[:, 1:].applymap(ast.literal_eval)
      
      s = df.set_index('ID', append=True).stack()
      
      df = pd.DataFrame(s.values.tolist(), index=s.index).unstack().sort_index(axis=1, level=1)
      df.columns = np.arange(len(df.columns))
      
      df = df.reset_index(level=1)
      print (df)
           ID       0       1       2       3       4       5       6       7  \
      0  1001  1001.0  1002.0     NaN     NaN     NaN     NaN     NaN     NaN   
      1  1010  1010.0  2001.0  2526.0  1000.0     NaN     NaN     NaN     NaN   
      2  1100  1234.0  5678.0  9101.0  1121.0  3141.0  5161.0  1718.0  1920.0   
      
              8       9  
      0     NaN     NaN  
      1     NaN     NaN  
      2  2122.0  2324.0  
      

      pandas 0.24+ 整数缺失值的解决方案:

      df = df.astype('Int64').reset_index(level=1)
      print (df)
           ID     0     1     2     3     4     5     6     7     8     9
      0  1001  1001  1002   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
      1  1010  1010  2001  2526  1000   NaN   NaN   NaN   NaN   NaN   NaN
      2  1100  1234  5678  9101  1121  3141  5161  1718  1920  2122  2324
      

      【讨论】:

      • 嗨,当我尝试查看整个数据框时,似乎在具有值的列之间存在 NaN 值。例如,在第 0 列和第 1 列中会有一个值,然后在第 3-4 列中存在“NaN”值,然后在 5-6 中再次存在值。如何删除介于两者之间的 NaN 值?
      • @Funky - 抱歉,我离线了。所以现在添加答案。顺便说一句,不推荐接受的答案 - 检查this。仅当性能不重要或 DataFrame 较小​​时才无关紧要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2013-11-07
      • 1970-01-01
      • 2012-11-07
      • 2016-08-25
      • 2017-10-24
      • 1970-01-01
      相关资源
      最近更新 更多