【问题标题】:Getting a tuple in a Dafaframe into multiple rows将 Dataframe 中的元组放入多行
【发布时间】:2017-02-08 23:47:21
【问题描述】:

我有一个数据框,它有两列(客户、交易)。 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 行方式来做到这一点。

【问题讨论】:

    标签: python pandas dataframe tuples reshape


    【解决方案1】:

    你可以使用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
    

    【讨论】:

    • 很高兴能帮到你!
    【解决方案2】:

    我认为以下速度更快:

    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))})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 2020-08-26
      相关资源
      最近更新 更多