尝试将pandas.DataFrame中的列“取消组合”列为多行时的ValueError

时间:2017-04-23 19:46:36

标签: python list pandas dataframe

我有一个名为pandas.DataFrame的{​​{1}}:

enter image description here

我试图使用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)

  

enter image description here

我做错了什么?

2 个答案:

答案 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