【问题标题】:Parse a dataframe column by comma and pivot - python通过逗号和透视解析数据框列 - python
【发布时间】:2018-06-11 15:40:17
【问题描述】:

我正在尝试通过逗号解析一列(也去除空格),然后将所有起点/终点组合旋转到新行中。以下是数据示例:

Origin     Destination     Weight
PVG        AMS, FRA        10,000
CAN, XMN   LAX, ORD        25,000

我在使用 pd.read_clipboard 复制上面的数据帧时遇到问题,所以这里是数据帧代码:

df = pd.DataFrame({'Origin': ['PVG', 'CAN, XMN'], 
                   'Destination': ['AMS, FRA', 'LAX, ORD'],
                   'Weight': [10000, 25000]})

期望的输出是:

Origin     Destination     Weight
PVG        AMS             10,000
PVG        FRA             10,000
CAN        LAX             25,000   
CAN        ORD             25,000
XMN        LAX             25,000
XMN        ORD             25,000   

我一直在尝试使用:

df['Origin'].str.split(',', expand = True)

我曾尝试对起点和终点都执行此操作,这适用于将字符串解析为单独的列。我正在努力将所有可​​能的组合创建到单独的行中(我尝试使用 pivot_table 并且没有运气融化)。

【问题讨论】:

  • 无论是我的答案,还是 jpp 的答案,都取决于您觉得更容易使用的内容。
  • @coldspeed 我不确定我是否只是不知道如何修改您/jpp 的答案以获得我正在寻找的东西,或者因为我正在寻找的答案是一个稍微不同的解决方案?在包示例中,p1 与#111 匹配,p2 与#222 匹配,依此类推...我试图解决的问题,使用包示例将是:p1 与#111 匹配的单独行,然后是#222,然后是#333。随着 p2 与 #111 匹配,然后是 #222,然后是 #333,依此类推。所以就像我说的,我不确定我是否不知道如何修改答案来解决我的问题,或者我需要找到不同的解决方案?
  • 哦,我明白了。你想要一个笛卡尔积......
  • 对不起我之前的评论,我的意图不是获得接受。我想改变你的心态,即首先回答不是选择最佳答案时使用的标准。采用这两种解决方案,在您的数据上进行测试,然后接受最适合您的一种。需要考虑的一些因素:性能和可读性。

标签: python pandas parsing pivot


【解决方案1】:

itertools.productlist comprehenion 一起使用,仅先使用applymap 创建列表:

from  itertools import product

df1 = df.applymap(lambda x: x.split(', ') if isinstance (x, str) else [x])
df2 = pd.DataFrame([j for i in df1.values for j in product(*i)], columns=df.columns)
print (df2)
  Origin Destination  Weight
0    PVG         AMS   10000
1    PVG         FRA   10000
2    CAN         LAX   25000
3    CAN         ORD   25000
4    XMN         LAX   25000
5    XMN         ORD   25000

【讨论】:

    【解决方案2】:

    你应该在这里使用itertools.product

    from itertools import product
    df_dict = {
        x[-1]: pd.DataFrame(list(
            product(x[0].split(', '), x[1].split(', ')))
        ) for x in df.values.tolist()
    }
    
    df = pd.concat(df_dict).reset_index(level=-1, drop=True).reset_index() 
    df.columns = ['Weight', 'Destination', 'Origin']
    

    df 
       Weight Destination Origin
    0   10000         AMS    PVG
    1   10000         FRA    PVG
    2   25000         LAX    CAN
    3   25000         LAX    XMN
    4   25000         ORD    CAN
    5   25000         ORD    XMN
    

    【讨论】:

    • @Brian 采用两种解决方案,在您的数据上进行测试,然后接受最适合您的一种。考虑性能和其他一切。不要仅仅因为打字快就奖励用户(我或其他任何人)。
    • 好的,待命我会为解决方案计时/看看什么最适合我
    • @Brian 这就是我想听到的 :) 顺便说一句,有几个错字,我已经改正了。
    • 经过进一步比较,我将不得不把它交给jezrael。对于我将其应用于/试图最终实现的目标,该代码更具动态性。我很感激进一步研究答案的挑战,你改变了我对正确答案的看法。
    • @Brian 完全可以。感谢您对答案进行公平冷静的评估。
    猜你喜欢
    • 2022-12-06
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    相关资源
    最近更新 更多