Python 如何从系列中提取不同长度的行值到新列?
假设我有一个带有系列C的熊猫数据帧,其中每个值都是一个列表。由于每个列表的长度不同,如何将此序列切片并附加到此数据帧的新列中 其他发现:以[,and',开头的每个字母都被添加到整个列表中(包括空格以分隔单词) 我应该如何将字母组合成一个单词,然后应用解决方案 样本df-Python 如何从系列中提取不同长度的行值到新列?,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有一个带有系列C的熊猫数据帧,其中每个值都是一个列表。由于每个列表的长度不同,如何将此序列切片并附加到此数据帧的新列中 其他发现:以[,and',开头的每个字母都被添加到整个列表中(包括空格以分隔单词) 我应该如何将字母组合成一个单词,然后应用解决方案 样本df- id A B C 0 1 2 ['Alan', 'Rod', 'Ben'] 1 1 3 ['Jeff']
id A B C
0 1 2 ['Alan', 'Rod', 'Ben']
1 1 3 ['Jeff']
2 4 6 ['Pete', 'Joe']
id A B C N1 N2 N3 N4 ....
0 1 2 ['Alan', 'Rod', 'Ben'] [ ' A l
1 1 3 ['Jeff'] [ ' J e
2 4 6 ['Pete', 'Joe'] [ ' P e
id A B C N1 N2 N3
0 1 2 ['Alan', 'Rod', 'Ben'] 'Alan' 'Rod' 'Ben'
1 1 3 ['Jeff'] 'Jeff' Nan Nan
2 4 6 ['Pete', 'Joe'] 'Pete' 'Joe' Nan
中间df-id A B C
0 1 2 ['Alan', 'Rod', 'Ben']
1 1 3 ['Jeff']
2 4 6 ['Pete', 'Joe']
id A B C N1 N2 N3 N4 ....
0 1 2 ['Alan', 'Rod', 'Ben'] [ ' A l
1 1 3 ['Jeff'] [ ' J e
2 4 6 ['Pete', 'Joe'] [ ' P e
id A B C N1 N2 N3
0 1 2 ['Alan', 'Rod', 'Ben'] 'Alan' 'Rod' 'Ben'
1 1 3 ['Jeff'] 'Jeff' Nan Nan
2 4 6 ['Pete', 'Joe'] 'Pete' 'Joe' Nan
预期df-id A B C
0 1 2 ['Alan', 'Rod', 'Ben']
1 1 3 ['Jeff']
2 4 6 ['Pete', 'Joe']
id A B C N1 N2 N3 N4 ....
0 1 2 ['Alan', 'Rod', 'Ben'] [ ' A l
1 1 3 ['Jeff'] [ ' J e
2 4 6 ['Pete', 'Joe'] [ ' P e
id A B C N1 N2 N3
0 1 2 ['Alan', 'Rod', 'Ben'] 'Alan' 'Rod' 'Ben'
1 1 3 ['Jeff'] 'Jeff' Nan Nan
2 4 6 ['Pete', 'Joe'] 'Pete' 'Joe' Nan
将序列转换为列表,这样您就有了列表列表,然后使用pandas.dataframe(listoflists)将其转换为数据帧。然后您可以将新的数据帧附加或合并到旧的数据帧。解决方案是的一个大大简化的版本。只需将长度不等的列表放入
pd.dataframe()
constructor,新列数将自动确定
df.join(pd.DataFrame(df["C"].apply(pd.Series))).rename(columns={0:"N1",1:"N2",2:"N3"})
A B C N1 N2 N3
0 1 2 [Alan, Rod, Ben] Alan Rod Ben
1 1 3 [Jeff] Jeff NaN NaN
2 4 6 [Pete, Joe] Pete Joe NaN
import pandas as pd
import numpy as np
df = pd.DataFrame(
[[1, 2,['Alan', 'Rod', 'Ben']],
[1, 3,['Jeff']],
[4, 6,['Pete', 'Joe']]],
columns=['A', 'B','C']
)
# 1. unpack and reconstruct a dataframe
df_unpack = pd.DataFrame(df["C"].to_list())
# optional: None to NaN
# df_unpack.fillna(np.nan)
print(df_unpack)
0 1 2
0 Alan Rod Ben
1 Jeff None None
2 Pete Joe None
# 2. concatenate the results
df_out = pd.concat([df, df_unpack], axis=1)
# 3. determine names
df_out.index.name = "id"
df_out.columns = ['A','B','C'] + [f"N{i+1}" for i in range(df_unpack.shape[1])]
print(df_out)
A B C N1 N2 N3
id
0 1 2 [Alan, Rod, Ben] Alan Rod Ben
1 1 3 [Jeff] Jeff None None
2 4 6 [Pete, Joe] Pete Joe None
迭代项目并创建新列:
newdf = pd.DataFrame();
for i , row in df.iterrows():
for j in range(len(row['C'])):
row['ncol{}'.format(j)] = row['C'][j]
newdf = newdf.append(row,ignore_index=True)
感谢@MhDG7对这个问题的初步思考。我刚刚发现这个列表是通过添加字母创建的。你能解释一下吗?如果列表是通过添加包含特殊字符的字母来构建的?(即,.\')@Bill Huang1)
df[[f“N{I+1}”表示范围(4)内的I)]。apply(lambda行):.join(行),axis=1)
可以将字符连接在一起。2)但将列表的字符串表示形式转换为列表将非常危险。是的,我知道有ast.literal\u eval(str\u list)
用于此目的(请参阅)。但我不确定它是否足够安全,不受特殊字符和引号的影响。3)我进一步建议您,如果可能的话,首先避免生成这样一个会引起麻烦的数据结构。