在第16行有一个包含多个项目的数组,如何将一个项目放到下一行并从之前删除? 它应该是这样的:
16 76561198316667197 MW 0.13028361 11715671189
17 76561198315155019 MW 0.13529198 11715512049
18 76561198338763319 MW 0.14147347 11712963469
答案 0 :(得分:1)
尝试MaxU的explode function:
def explode(df, lst_cols, fill_value=''):
# make sure `lst_cols` is a list
if lst_cols and not isinstance(lst_cols, list):
lst_cols = [lst_cols]
# all columns except `lst_cols`
idx_cols = df.columns.difference(lst_cols)
# calculate lengths of lists
lens = df[lst_cols[0]].str.len()
if (lens > 0).all():
# ALL lists in cells aren't empty
return pd.DataFrame({
col:np.repeat(df[col].values, df[lst_cols[0]].str.len())
for col in idx_cols
}).assign(**{col:np.concatenate(df[col].values) for col in lst_cols}) \
.loc[:, df.columns]
else:
# at least one list in cells is empty
return pd.DataFrame({
col:np.repeat(df[col].values, df[lst_cols[0]].str.len())
for col in idx_cols
}).assign(**{col:np.concatenate(df[col].values) for col in lst_cols}) \
.append(df.loc[lens==0, idx_cols]).fillna(fill_value) \
.loc[:, df.columns]
答案 1 :(得分:0)
我很确定这不是最有效的方法,但它确实有效。假设您的First_Column包含两个列表。
a = df['First_Column'].values
b = [a[i][0] for i in range(0, len(a))]
c = [a[i][1] for i in range(0, len(a))]
d = {'col1': b, 'col2': c}
new_df = pd.DataFrame(d)
答案 2 :(得分:0)
我打破了台阶。
df = pd.DataFrame({'col1': [[5, 3], [1]], 'col2': [[7, 5], [2]], 'col3': ['MW','MW']})#sample data
df1=df[df.col1.apply(len)>1]
df2=df[df.col1.apply(len)==1]
df1=df1.set_index('col3').stack().apply(pd.Series).stack().unstack(-2).reset_index().drop('level_1',1)
df2=df2.apply(lambda x : x.values[0])
pd.concat([df1,df2],axis=0).reset_index(drop=True)
Out[533]:
col1 col2 col3
0 5 7 MW
1 3 5 MW
2 1 2 MW