Python :从熊猫数据框中分解行
Python : Explode rows from panda dataframe
我是 Python 的新手,我正在研究熊猫数据框。
所以我有一个像这样的数据框:
Client_id Nb_Products
1 2
2 3
3 1
我需要将每一行展开 Nb_Products 次,每个 client_id。
所以我需要输出以下 table:
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]
然后炸掉它。
但是我无法成功创建它。
如果有任何答案或部分答案,我将不胜感激。
谢谢
方法论
我首先使用索引来加快速度并获取唯一的客户端 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']
)
初始数据帧
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_id
Nb_products
时间内的值重复到 'explode' 您的数据集即可。通过 Nb_products
列中的值在一行中重复 Client_id
值将产生新数据帧的 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'])
我是 Python 的新手,我正在研究熊猫数据框。
所以我有一个像这样的数据框:
Client_id Nb_Products
1 2
2 3
3 1
我需要将每一行展开 Nb_Products 次,每个 client_id。 所以我需要输出以下 table:
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]
然后炸掉它。 但是我无法成功创建它。
如果有任何答案或部分答案,我将不胜感激。 谢谢
方法论
我首先使用索引来加快速度并获取唯一的客户端 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']
)
初始数据帧
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_id
Nb_products
时间内的值重复到 'explode' 您的数据集即可。通过 Nb_products
列中的值在一行中重复 Client_id
值将产生新数据帧的 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'])