Python:从熊猫数据框中分解行

时间:2017-08-09 10:14:05

标签: python dataframe range explode

我是Python新手,我正在研究熊猫数据框架。

所以我有一个类似的数据框:

Client_id   Nb_Products
1           2
2           3
3           1

我需要为每个 client_id 分解每行 Nb_Products 次。 所以我需要输出下表:

Client_id   Product_Nb
1           1
1           2
2           1
2           2
2           3
3           1

起初我认为我应该为 Nb_Products 创建一系列数字,如:

Client_id   Nb_Products_rng
1           [1,2]
2           [1,2,3]
3           [1]

然后爆炸它。 但我无法成功创造这个。

我会对任何答案或部分答案都很满意。 谢谢

2 个答案:

答案 0 :(得分:0)

方法

我首先使用索引来加快速度并获得独特的客户端ID

df = df.set_index('Client_id')
client_ids = df.index.get_level_values('Client_id').unique()

然后,我只需通过迭代每个客户端的所有产品来重建DataFrame

res = pd.DataFrame(
    [
        [client, prod]
        for client in client_ids
        for prod in range(1, df.loc[client, 'Nb_Products'].max()+1)
    ],
    columns = ['Client_id', 'Nb_Products']
)

示例/测试

我使用的测试数据

import pandas as pd
df = pd.DataFrame(
    [[1, 2], [2, 3], [3, 3]],
    columns=['Client_id', 'Nb_Products']
)

初始DataFrame

   Client_id  Nb_Products
0          1            2
1          2            3
2          3            3

结果

   Client_id  Nb_Products
0          1            1
1          1            2
2          2            1
3          2            2
4          2            3
5          3            1
6          3            2
7          3            3

答案 1 :(得分:0)

您可以通过重复Client_id Nb_products时间内的值来实现这一目标,以便爆炸'你的数据集。通过Client_id列中的值重复行中的Nb_products值将生成新数据帧的Client_id变量。我使用列表理解来做到这一点。

要获得第二列 - Product_Nb,您只需要一个从1开始的序列。

from io import StringIO
import pandas as pd

TESTDATA=StringIO("""Client_id Nb_Products
1 2
2 3
3 1""")

df = pd.read_csv(TESTDATA, sep=" ")

col1 = []
_ = [col1.extend([a]*b) for a,b in zip(df.iloc[:,0].values.tolist(), df.iloc[:,1].values.tolist())]
col2 = []
_ = [col2.extend(list(range(1,i+1))) for i in df.iloc[:,1].values.tolist()]

df2 = pd.DataFrame(list(zip(col1,col2)),columns = ['Client_id', 'Product_Nb'])