我有一个对象列表,我想检查和扩展。具体来说,我的初始数据帧是
Name
1 object1
7 object2
6 object3
4 object4
0 object5
8 object6
我将以下函数应用于我的数据框架:
def example(file):
...
my_list2 = []
for u in file['Name']:
try:
minim = ...
except:
minim = 'NA'
my_list2.append(minim)
file['Others'] = my_list2
return file
创建一个新的列Others
,看起来像:
Name Others
1 object1 [object4, object3, object22]
7 object2 [object1]
6 object3 [object1]
...
我想做的是将该函数也应用于Others
列中的列表中的每个元素。这意味着我应该为第一个列表中的每个变量运行它,即
[object4, object3, object22]
为了添加到我的初始数据框一行(object22
,因为它不包括在Name
列),并有这样的东西
Name Others
1 object1 [object4, object3, object22]
7 object2 [object1]
6 object3 [object1]
...
10 object22 [object23, object40, object1]
当然,当Others
中的所有元素都在Name
列中时,循环停止运行。objectX
在本例中只是一个虚拟名称:Name
中的变量名称可以是dog
,或mom
,或其他任何名称。
我不知道如何运行该函数,以便将其应用于Others
列下的列表中的元素,以附加原始数据集中的结果。
如果您需要更多的信息,请告诉我。
概要:
我需要运行函数
- 为列名中的对象。这将为每个对象生成一个字符串列表(最终也是空列表);
- 对于字符串列表中的每个对象:这会在Name列 中创建新行
- 用于
Name
列 中添加的新对象
这个答案只是解决如何提取新的Name
来处理。
你可以使用' explosion '将列表的元素变成行:
data = [{'Name': 'object1', 'Others': ['object4', 'object3', 'object22']},
{'Name': 'object2', 'Others': ['object1']},
{'Name': 'object3', 'Others': ['object1']}]
df = pd.DataFrame(data)
print(df)
Name Others
0 object1 [object4, object3, object22]
1 object2 [object1]
2 object3 [object1]
df_exp = df.explode('Others')
print(df_exp)
Name Others
0 object1 object4
0 object1 object3
0 object1 object22
1 object2 object1
2 object3 object1
objn = pd.Series(list(set(df_exp['Others']) - set(df['Name'])), name='Name')
print(objn)
0 object4
1 object22
Name: Name, dtype: object
然后对objn
应用函数创建Others
内容。将新数据框指定为dfn
。
df = df.append(dfn)
重复爆炸并应用func直到len(objn) == 0
。