python 基于另一列复制行

liwlm1x9  于 2022-10-30  发布在  Python
关注(0)|答案(3)|浏览(147)

我有以下数据框

现在,我想传输 Dataframe ,如下所示

我已经用python命令来做了,但是没有一个成功的。有人能帮助我做这个吗?
n_df = pd.连续([df] * 最终_n)
newdf = pd. Dataframe (np.重复(df.值,最终_n,轴=0))

mcdcgff0

mcdcgff01#

使用itertools库的函数product

from itertools import product

combi_rows = product(df.store.dropna(), df.mas_id.dropna())
new_df = pd.DataFrame(combi_rows, columns=df.columns)

输出量

store  mas_id
0   100.0       1
1   100.0       2
2   100.0       3
3   100.0       4
4   101.0       1
5   101.0       2
6   101.0       3
7   101.0       4
8   102.0       1
9   102.0       2
10  102.0       3
11  102.0       4

编辑:
如果要按mas_id列进行排序,

new_df = new_df.sort_values('mas_id')

输出量

store  mas_id
0   100.0       1
4   101.0       1
8   102.0       1
1   100.0       2
5   101.0       2
9   102.0       2
2   100.0       3
6   101.0       3
10  102.0       3
3   100.0       4
7   101.0       4
11  102.0       4
bogh5gae

bogh5gae2#

您可以将itertools的函数product

import itertools

result = pd.DataFrame(list(itertools.product(df.store.unique(), df.mas_id.unique())),columns=df.columns)

如果您不想包含nan值,只需按如下方式更新它:

result = pd.DataFrame(list(itertools.product(df.store.dropna().unique(), df.mas_id.dropna().unique())),columns=df.columns)
avwztpqn

avwztpqn3#

另一种可能的解决方案,基于pandas.mergehow='cross'

(df.merge(df, how='cross', suffixes=('','2'))[['store2', 'mas_id']]
 .dropna().rename(columns={'store2': 'store'})
)

另一种可能的解决方案是基于numpy.tilenumpy.repeat

pd.DataFrame(
    {'store': np.tile(df.store.dropna(), len(df)),
     'mas_id': np.repeat(df.mas_id, len(df.store.dropna()))
     }
)

输出量:

store  mas_id
0  100.0       1
0  101.0       1
0  102.0       1
1  100.0       2
1  101.0       2
1  102.0       2
2  100.0       3
2  101.0       3
2  102.0       3
3  100.0       4
3  101.0       4
3  102.0       4

相关问题