我有一个关于将结果添加到现有数据框的问题。
if relevant_item != 'None' and relevant_item != 'Not in dict':
items = relevant_item
len_item = len(items)
if len_item == 1:
item_result = items
if len_item == 2:
two = items
item_result = some_method(two)
if len_item == 3:
threes = items
item_result = some_method(three)
hash_in_dict_shopping.append(item_result)#new list of list
shops = pd.Series(hash_in_dict_shopping)
df_final['hash_in_shop'] = shops.values
将新列表附加到现有数据帧时,我收到一条错误消息“ValueError:值的长度与索引的长度不匹配”,所以我想知道如何将新列表添加到新列并填充所有缺少带有“none”的行值,同时保持原始顺序?
过滤前的原始数据(约700行):
'None'
'Not in dict'
['apple','banana', 'grapes']
'None'
'Not in dict'
'Not in dict'
['pasta', 'rice', 'lentils']
'None'
'None'
['milk']
过滤相关项目的数据后(大约 40 行):
['apple','banana', 'grapes']
['pasta', 'rice', 'lentils']
['milk']
应用 some_method 后(从字典返回一个值):
['fruit','green groceries']
['dry food', 'staples', 'legumes']
['dairy']
数据框中的新列包含所有 700 行:
'None'
'None'
['fruit','green groceries']
'None'
'None'
'None'
['dry food', 'staples', 'legumes']
'None'
'None'
['dairy']
最佳答案
有两点需要注意:
- 迭代系列时,您不应忽略/跳过“无”/“不在字典中”行。您的新系列必须与原始系列的长度相同。
- 您应该使用内置的 Pandas 功能来按行应用函数。由于您无法使用矢量化功能(因为您的数据框包含
list
对象),因此您可以将pd.Series.apply
与自定义函数一起使用。
这是一个最小的示例:
df = pd.DataFrame({'col': ['None', 'Not in dict', ['apple', 'banana', 'grapes'],
'None', ['mile'], 'Not in dict']})
def calculated(x):
try:
if x in {'Not in dict', 'None'}:
return None
except TypeError:
if len(x) == 1:
return 2
elif len(x) == 2:
return 4
else:
return 6
df['calc'] = df['col'].apply(calculated)
print(df)
col calc
0 None NaN
1 Not in dict NaN
2 [apple, banana, grapes] 6.0
3 None NaN
4 [mile] 2.0
5 Not in dict NaN
关于python - 将新列添加到可变长度的数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51358500/