运行SQL查询后,我得到一个数据框,其中的一列看起来像这样:
d = {'values': ['2,3,2,2', '2,3,5', '2', '3,4,2,2,2']}
df = pd.DataFrame(data=d)
我需要做的是将每个字符串变成数字列表:
d = {'values': [[2, 3, 2, 2], [2, 3, 5], [2], [3, 4, 2, 2, 2]]}
有没有一种Python方式来做到这一点?
答案 0 :(得分:3)
这是使用pd.eval
和explode
的另一种方式
注释中的Jezrael帽子提示(用于评估线程)和cs95帽子提示(用于pd.Eval提示),请阅读:
Why using eval is bad practice
df['values_agg'] = df['values'].map(pd.eval)
print(df)
values values_agg
0 2,3,2,2 [2, 3, 2, 2]
1 2,3,5 [2, 3, 5]
2 2 [2]
3 3,4,2,2,2 [3, 4, 2, 2, 2]
或以更详细的方式避免评估。
df['values'].str.split(',').explode().astype(int).groupby(level=0).agg(list)
答案 1 :(得分:2)
使用pandas.Series.str.findall
:
df["values"] = df["values"].str.findall("\d+")
d2 = df.to_dict("list")
print(d2)
输出:
{'values': [['2', '3', '2', '2'],
['2', '3', '5'],
['2'],
['3', '4', '2', '2', '2']]}
答案 2 :(得分:2)
由于将转换值转换为整数后需要数字:
df['values'] = df['values'].apply(lambda x: [int(y) for y in x.split(',')])
print (df)
values
0 [2, 3, 2, 2]
1 [2, 3, 5]
2 [2]
3 [3, 4, 2, 2, 2]
print (df.to_dict("l"))
{'values': [[2, 3, 2, 2], [2, 3, 5], [2], [3, 4, 2, 2, 2]]}
对于数字的字符串表示法更简单,请仅使用Series.str.split
:
df['values'] = df['values'].str.split(',')
print (df.to_dict("l"))
{'values': [['2', '3', '2', '2'], ['2', '3', '5'], ['2'], ['3', '4', '2', '2', '2']]}
答案 3 :(得分:1)
您可以使用列表理解功能:
d = {'values': [list(map(int, x.split(','))) for x in df['values']]}
[出]
{'values': [[2, 3, 2, 2], [2, 3, 5], [2], [3, 4, 2, 2, 2]]}