Python:从panda数据帧分解行

Python:从panda数据帧分解行,python,dataframe,range,explode,Python,Dataframe,Range,Explode,我是Python新手,正在研究panda数据框架 因此,我有一个数据帧,如: Client_id Nb_Products 1 2 2 3 3 1 我需要为每个客户id分解每行Nb_Products次。 所以我需要输出下表: Client_id Product_Nb 1 1 1 2 2 1 2 2 2 3 3

我是Python新手,正在研究panda数据框架

因此,我有一个数据帧,如:

Client_id   Nb_Products
1           2
2           3
3           1
我需要为每个客户id分解每行Nb_Products次。 所以我需要输出下表:

Client_id   Product_Nb
1           1
1           2
2           1
2           2
2           3
3           1
首先,我认为我应该为Nb_产品创建一系列数字,如:

然后引爆它。 但我没能成功地创造这个

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

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

df = df.set_index('Client_id')
client_ids = df.index.get_level_values('Client_id').unique()
然后,我通过迭代每个客户机的所有产品来重构数据帧

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']
)
初始数据帧

   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
方法论 我首先使用索引来加快速度并获得唯一的客户端ID

df = df.set_index('Client_id')
client_ids = df.index.get_level_values('Client_id').unique()
然后,我通过迭代每个客户机的所有产品来重构数据帧

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']
)
初始数据帧

   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

只需重复
Client\u id
Nb\u products
时间“爆炸”数据集中的值即可。按
Nb\u products
列中对应的值在一行中重复
Client\u id
值,将生成新数据帧的
Client\u id
变量。我使用列表理解来实现这一点

要获得第二列-
Product\u 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'])

只需重复
Client\u id
Nb\u products
时间“爆炸”数据集中的值即可。按
Nb\u products
列中对应的值在一行中重复
Client\u id
值,将生成新数据帧的
Client\u id
变量。我使用列表理解来实现这一点

要获得第二列-
Product\u 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'])

我个人讨厌将列表放入pandas
dataframe
这样的东西-我一直看到它,这里也没有必要。我个人讨厌将列表放入pandas
dataframe
这样的东西-我一直看到它,这里也没有必要。你确定输出匹配吗OP的要求?这不是返回相同的数据帧吗instead@ClockSlave这正是我所需要的。谢谢你的帮助,我也会尝试你的建议并让你知道。你确定输出符合OP的要求吗?这不是返回相同的数据帧吗instead@ClockSlave这正是我所需要的。谢谢你的帮助,我也会尝试你的建议,让你知道。