熊猫将字符串转换为列表以使用爆炸

时间:2019-11-15 20:06:05

标签: python pandas dataframe

我正在使用一个包含多个列的数据框,我的目标是创建一个额外的列,其中包含这些列的值的列表,然后在该新列上爆炸该数据框。

这是原始数据集:

         id  day_a1  day_a2  ...   day_a6
13804  002n    25.0    25.0  ...     25.0
30842  002c    30.0    30.0  ...     30.0
1624   002k    25.0     NaN  ...     25.0
8959   002j    25.0    25.0  ...     25.0
21216  003t    25.0    25.0  ...     25.0

我使用df['vector'] = df[['day_a1,'day_a2','day_a3','day_a4','day_a5','day_a6']].astype(str).apply(lambda x: ','.join(axis=1)创建了这个额外的列,该列应该是day列从1到6的所有日期的列表。

print(df['vector'])返回以下输出:

13804    25.0,25.0,24.0,25.0,25.0,25.0
30842    30.0,30.0,31.0,28.0,31.0,30.0
1624         25.0,nan,nan,nan,nan,25.0
8959     25.0,25.0,25.0,25.0,25.0,25.0

不是被解释为列表,因此,如果尝试new_df = df.explode('vector'),则不会发生任何事情。

但是,我也尝试使用以下方法将列vector转换为列表:

def listing(row):
    val = list(row['vector'])
    return val
df['vector_b'] = df.apply(listing,axis=1)

但是它也不起作用,因为每一行都被解释为字符串,因此列表被创建为:

13804    [2, 5, ., 0, ,, 2, 5, ., 0, ,, 2, 4, ., 0, ,, ...
30842    [3, 0, ., 0, ,, 3, 0, ., 0, ,, 3, 1, ., 0, ,, ...
1624     [2, 5, ., 0, ,, n, a, n, ,, n, a, n, ,, n, a, ...

如何创建一个额外的列,其中包含列day_a1day_a2day_a6的值,这些列将被解释为一个列表,以便以后在explode上使用?

  • 我也尝试过在自定义函数中使用ast.literal_eval(),但由于返回错误而无法使用。
  • 在应用.astype(str)之前,我需要先使用lambda,否则我会收到一条错误消息,提示应输入字符串,但接收到浮点数。

谢谢。

预期输出为:

         id  vector  
13804  002n    25.0 
13804  002n    25.0
       ....    ....
13804  002n    25.0
30842  002c    30.0
30842  002c    30.0
  ...   ...     ...
30842  002c    30.0
1624   002k    25.0
1624   002k     NaN
 ...    ...     ...
1624   002k    25.0

2 个答案:

答案 0 :(得分:2)

再三考虑,这可能对您更好:

df.set_index('id', append=True).stack()

输出:

       id          
13804  002n  day_a1    25.0
             day_a2    25.0
             day_a6    25.0
30842  002c  day_a1    30.0
             day_a2    30.0
             day_a6    30.0
1624   002k  day_a1    25.0
             day_a6    25.0
8959   002j  day_a1    25.0
             day_a2    25.0
             day_a6    25.0
21216  003t  day_a1    25.0
             day_a2    25.0
             day_a6    25.0
dtype: float64

答案 1 :(得分:1)

您也可以这样做:

df[['day_a1','day_a2','day_a3','day_a4','day_a5','day_a6']].apply(lambda x: x.tolist(), axis=1)