我正在使用一个包含多个列的数据框,我的目标是创建一个额外的列,其中包含这些列的值的列表,然后在该新列上爆炸该数据框。
这是原始数据集:
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_a1
,day_a2
到day_a6
的值,这些列将被解释为一个列表,以便以后在explode
上使用?
.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
答案 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)