熊猫创建列并使用apply中的值进行更新

时间:2018-11-18 17:41:45

标签: python pandas dictionary dataframe

我正在尝试基于具有dict(作为字符串)的列创建新列。 例如,这些列包含{'human_number':100}和下一个{'robot_number':3221}

现在我要做的是遍历每一行并根据键创建一列,然后将该值填充到相应的列中。 例如: 如果某行在type_info列中包含{'human_number':100},则该行中应该有一个名为human_number的列,其中的数字为100,而robot_number中的内容为空。

def number_assign(row):
try:
    temp = next(iter(ast.literal_eval(row["type_info"])))
    row[temp] = next(iter(ast.literal_eval(row["type_info"]).values()))
except:
    pass

然后我用df_test.apply(number_assign,axis = 1)呼叫

x = pd.DataFrame({'x': ["{'robot_number':1234}", "{'human_number':33}", '', "{'animal_number':223}"], 'y': [3, 4, 5,11]})

应该变成这样:

x = pd.DataFrame({'x': ["{'robot_number':1234}", "{'human_number':33}", '', "{'animal_number':223}"], 'y': [3, 4, 5,11], 'robot_number': [1234,'','',''], 'human_number' :['',33,'',''], 'animal_number':['','','',223] })

1 个答案:

答案 0 :(得分:0)

将字典列表发送到pd.DataFrame

pd.DataFrame构造函数是通用且高效的。您可以直接输入词典列表:

from ast import literal_eval

df = pd.DataFrame({'A': ["{'human_number':100}", "{'robot_number': 3221}"]})

df = pd.DataFrame(list(map(literal_eval, df['A'])))

print(df)

   human_number  robot_number
0         100.0           NaN
1           NaN        3221.0

该解决方案适用于每个字符串字典中的任意键/值。如果您有空字符串,则可以将列表理解与三元语句一起使用:

df = pd.DataFrame({'A': ["{'human_number':100}", "{'robot_number': 3221}", ""]})

df = pd.DataFrame([literal_eval(x) if x and (x == x) else {} for x in df['A']])

print(df)

   human_number  robot_number
0         100.0           NaN
1           NaN        3221.0
2           NaN           NaN