我有一个名为pandas.DataFrame
的{{1}}:
我试图使用this answer的帮助将my_df
列中的列表“取消组合”成多行。
但是,当我尝试此代码时(与提供的链接中的答案相同):
tag
我收到错误:
由于此行(编号9)而触发的my_df.reset_index(inplace=True, drop=True)
rows = []
my_df.apply(lambda row: [rows.append([row['q_id'], row['body'], t])
for t in row.tag], axis=1)
df_new = pd.DataFrame(rows, columns=my_df.columns)
:
我做错了什么?
答案 0 :(得分:2)
我对您的代码进行了更改,现在可以正常运行了。当您使用apply函数时,问题出现在您的代码中,它会尝试从lambda函数的返回构造一个新的数据帧。在这种情况下,lambda会为每行返回不同数量的列,因为您的标记中包含不同数量的单词。添加len()会强制你的lambda总是返回1列,这将解决这个问题。
rows = []
my_df = pd.DataFrame(data={'q_id':range(5),'body':['abc']*5,
'tag':[['pset1','maria','check50'],
['maria', 'pset1'],
['greedy','pset1'],
['pset'],
['pset']]})
my_df.apply(lambda row: len([rows.append([row['q_id'], row['body'], t]) for t in row.tag]), axis=1)
df_new = pd.DataFrame(rows, columns=my_df.columns)
df_new
Out[63]:
body q_id tag
0 0 abc pset1
1 0 abc maria
2 0 abc check50
3 1 abc maria
4 1 abc pset1
5 2 abc greedy
6 2 abc pset1
7 3 abc pset
8 4 abc pset
答案 1 :(得分:1)
你介意我给你一个不同的方法吗?
生成数据:
df_new = pd.merge(my_df,
(my_df['tag'].apply(lambda x: pd.Series(x)).T
.unstack().reset_index(level=-1, drop=True)
.dropna().to_frame()),
left_index = True,
right_index = True).drop('tag', axis=1)
df_new = df_new.rename(columns={0:'tag'})[['q_id','body','tag']]
print(df_new)
"取消组合":
q_id body tag
0 1036.0 Mario Pyramid - Check 50 pest1
0 1036.0 Mario Pyramid - Check 50 mario
0 1036.0 Mario Pyramid - Check 50 check50
1 1039.0 What's wrong wth my code? mario
1 1039.0 What's wrong wth my code? pset1
2 1089.0 Why do I get errors greedy
2 1089.0 Why do I get errors pset1
3 1103.0 How does a person make pset1
4 1125.0 How do I fix pset1
输出:
scrollviewer.cancontentscroll