基于不同列中的值重复行

MRA*_*MRA 12 python pandas

我有一个交易数据框.每行代表两个项目的交易(将其视为2个事件票据或其他事务的交易).我想根据销售数量复制每一行.

这是示例代码:

# dictionary of transactions

d = {'1': ['20', 'NYC', '2'], '2': ['30', 'NYC', '2'], '3': ['5', 'NYC', '2'], \
     '4': ['300', 'LA', '2'], '5': ['30', 'LA', '2'],  '6': ['100', 'LA', '2']}

columns=['Price', 'City', 'Quantity']

# create dataframe and rename columns

df = pd.DataFrame.from_dict(data=d, orient='index')
df.columns = columns
Run Code Online (Sandbox Code Playgroud)

这会生成一个如下所示的数据框

Price   City    Quantity

20       NYC         2

30       NYC         2

5        NYC         2

300      LA          2

30       LA          2

100      LA          2
Run Code Online (Sandbox Code Playgroud)

因此,在上面的情况中,每行将转换为两个重复的行.如果'quantity'列为3,那么该行将转换为三个重复行.

Ale*_*der 9

首先,我使用整数而不是文本重新创建数据.我也改变了数量,以便更容易理解问题.

d = {1: [20, 'NYC', 1], 2: [30, 'NYC', 2], 3: [5, 'SF', 3],      
     4: [300, 'LA', 1], 5: [30, 'LA', 2],  6: [100, 'SF', 3]}

columns=['Price', 'City', 'Quantity'] 
# create dataframe and rename columns

df = pd.DataFrame.from_dict(data=d, orient='index').sort_index()
df.columns = columns

>>> df
   Price City  Quantity
1     20  NYC         1
2     30  NYC         2
3      5   SF         3
4    300   LA         1
5     30   LA         2
6    100   SF         3
Run Code Online (Sandbox Code Playgroud)

我使用嵌套列表理解结构创建了一个新的DataFrame.

df_new = pd.DataFrame([df.ix[idx] 
                       for idx in df.index 
                       for _ in range(df.ix[idx]['Quantity'])]).reset_index(drop=True)
>>> df_new
    Price City  Quantity
0      20  NYC         1
1      30  NYC         2
2      30  NYC         2
3       5   SF         3
4       5   SF         3
5       5   SF         3
6     300   LA         1
7      30   LA         2
8      30   LA         2
9     100   SF         3
10    100   SF         3
11    100   SF         3
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 7

使用回答 repeat

df.loc[df.index.repeat(df.Quantity)]
Out[448]: 
  Price City Quantity
1    20  NYC        2
1    20  NYC        2
2    30  NYC        2
2    30  NYC        2
3     5  NYC        2
3     5  NYC        2
4   300   LA        2
4   300   LA        2
5    30   LA        2
5    30   LA        2
6   100   LA        2
6   100   LA        2
Run Code Online (Sandbox Code Playgroud)

  • 无意冒犯其他贡献者,但我认为这应该是公认的答案:) (9认同)