我有如下格式的数据帧。描述为字符串格式。
文件 | 描述 | x | [[数组(["麻省理工学院","麻省理工学院","麻省理工学院","麻省理工学院","麻省理工学院"),dtype =对象),数组((0.71641791,0.71641791,0.71641791,0.69565217,0.69565217])]] | y
---|---|
[[阵列(["apsl - 1.0","apsl - 1.0","apsl - 1.0","apsl - 1.0","apsl - 1.0 '], dtype =对象),数组([0.28552457,0.28552457,0.28552457,0.28552457,0.28552457])]] |
更新,如果列中的元素为字符串格式,则可以找到具有regex
公式的数组。(注意不要使用eval,为什么要避免使用exec()和eval()呢?)
import ast
new_cols = lambda x: pd.Series({'licence':ast.literal_eval(x[0]),
'score':ast.literal_eval(x[1])})
df = df.join(df['m'].str.findall(r'[[^[]]*]').apply(new_cols)).drop('m', axis=1)
print(df)
输出:
file licence score
0 x ['MIT', 'MIT', 'MIT', 'MIT', 'MIT'] [0.71641791, 0.71641791, 0.71641791, 0.6956521...
1 y ['APSL-1.0', 'APSL-1.0', 'APSL-1.0', 'APSL-1.0', ... [0.28552457, 0.28552457, 0.28552457, 0.2855245...
regex
公式如何查找数组:(查找字符串以[
开始,以]
结束,但在查找字符串时不应该有[
或]
来查找所有数组)
>>> import re
>>> re.findall(r'[[^[]]*]', "[[np.array(['MIT', 'MIT', 'MIT', 'MIT', 'MIT'], dtype=object), np.array([0.71641791, 0.71641791, 0.71641791, 0.69565217, 0.69565217])]]",)
["['MIT', 'MIT', 'MIT', 'MIT', 'MIT']",
'[0.71641791, 0.71641791, 0.71641791, 0.69565217, 0.69565217]']
,您可以创建新的列,然后与旧的dataframe
连接。
new_cols = lambda x: pd.Series({'licence':x[0][0], 'score':x[0][1]})
df = df.join(df['m'].apply(new_cols)).drop('m', axis=1)
print(df)
输入:
file description
0 x [[array(['MIT', 'MIT', 'MIT', 'MIT', 'MIT'], d...
1 y [[array(['APSL-1.0', 'APSL-1.0', 'APSL-1.0', '...
做:
import ast
df.description = (df.description.str.replace('array', '')
.str.replace(', dtype=object', '')
.apply(ast.literal_eval))
df[['license', 'score']] = [(x[0], x[1]) for x in df.description.str[0]]
df = df.drop('description', axis=1)
print(df)
输出:
file license score
0 x [MIT, MIT, MIT, MIT, MIT] [0.71641791, 0.71641791, 0.71641791, 0.6956521...
1 y [APSL-1.0, APSL-1.0, APSL-1.0, APSL-1.0, APSL-... [0.28552457, 0.28552457, 0.28552457, 0.2855245...