我有一个数据框,每列{'value':2343}中都包含字典。我正在尝试摆脱字典,并将单元格设置为等于数据框中所有字典的值。
import pandas as pd
df = pd.DataFrame([
{'node': 'A', 'read': {'value': 2343}, 'write': {'value': 23}},
{'node': 'B', 'read': {'value': 334}, 'write': {'value': 233444}},
])
我可以将单元格的值设置为一列:
df['read'] = df['read'].apply(lambda x: x['value'])
是否有办法在数据框中的所有列上执行此操作?我应该遍历所有列吗?
预期输出应为数据框:
df = pd.DataFrame([
{'node': 'A', 'read': 2343, 'write': 23},
{'node': 'B', 'read': 334, 'write': 233444},
])
答案 0 :(得分:1)
您可以使用applymap:
import pandas as pd
df = pd.DataFrame([
{'node': 'A', 'read': {'value': 2343}, 'write': {'value': 23}},
{'node': 'B', 'read': {'value': 334}, 'write': {'value': 233444}},
])
cols = ['read', 'write']
df[cols] = df[cols].applymap(lambda x: x['value'])
print(df)
[Out]:
node read write
0 A 2343 23
1 B 334 233444
答案 1 :(得分:0)
这如何:
df.apply(lambda x: x.apply(lambda y: y['value'] if isinstance(y, dict) else y))
使用此方法,您不必担心选择哪些列是字典。
答案 2 :(得分:0)
如果它们是字典,则可以使用.str
访问器,如下所示
df['read'] = df['read'].str['value']
df['write'] = df['write'].str['value']