将数据框中的元组放入多行
Getting a tuple in a Dafaframe into multiple rows
我有一个数据框,它有两列(客户、交易)。
Transactions 列是该客户所有交易 ID 的元组。
Customer Transactions
1 (a,b,c)
2 (d,e)
我想将其转换为数据框,其中包含客户和交易 ID,如下所示。
Customer Transactions
1 a
1 b
1 c
2 d
2 e
我们可以使用循环来做到这一点,但是是否有直接的 1 或 2 行方法来做到这一点。
您可以使用 DataFrame
构造函数:
df = pd.DataFrame({'Customer':[1,2],
'Transactions':[('a','b','c'),('d','e')]})
print (df)
Customer Transactions
0 1 (a, b, c)
1 2 (d, e)
df1 = pd.DataFrame(df.Transactions.values.tolist(), index=df.Customer)
print (df1)
0 1 2
Customer
1 a b c
2 d e None
然后用 stack
重塑:
print (df1.stack().reset_index(drop=True, level=1).reset_index(name='Transactions'))
Customer Transactions
0 1 a
1 1 b
2 1 c
3 2 d
4 2 e
我认为以下速度更快:
import numpy as np
import random
import string
import pandas as pd
from itertools import chain
customer = np.unique(np.random.randint(0, 1000000, 100000))
transactions = [tuple(string.ascii_letters[:random.randint(3, 10)]) for _ in range(len(customer))]
df = pd.DataFrame({"customer":customer, "transactions":transactions})
df2 = pd.DataFrame({
"customer": np.repeat(df.customer.values, df.transactions.str.len()),
"transactions": list(chain.from_iterable(df.transactions))})
我有一个数据框,它有两列(客户、交易)。 Transactions 列是该客户所有交易 ID 的元组。
Customer Transactions
1 (a,b,c)
2 (d,e)
我想将其转换为数据框,其中包含客户和交易 ID,如下所示。
Customer Transactions
1 a
1 b
1 c
2 d
2 e
我们可以使用循环来做到这一点,但是是否有直接的 1 或 2 行方法来做到这一点。
您可以使用 DataFrame
构造函数:
df = pd.DataFrame({'Customer':[1,2],
'Transactions':[('a','b','c'),('d','e')]})
print (df)
Customer Transactions
0 1 (a, b, c)
1 2 (d, e)
df1 = pd.DataFrame(df.Transactions.values.tolist(), index=df.Customer)
print (df1)
0 1 2
Customer
1 a b c
2 d e None
然后用 stack
重塑:
print (df1.stack().reset_index(drop=True, level=1).reset_index(name='Transactions'))
Customer Transactions
0 1 a
1 1 b
2 1 c
3 2 d
4 2 e
我认为以下速度更快:
import numpy as np
import random
import string
import pandas as pd
from itertools import chain
customer = np.unique(np.random.randint(0, 1000000, 100000))
transactions = [tuple(string.ascii_letters[:random.randint(3, 10)]) for _ in range(len(customer))]
df = pd.DataFrame({"customer":customer, "transactions":transactions})
df2 = pd.DataFrame({
"customer": np.repeat(df.customer.values, df.transactions.str.len()),
"transactions": list(chain.from_iterable(df.transactions))})