【问题标题】:Python - Pandas - Dataframe: Row Specific Conditional Column OffsetPython - Pandas - Dataframe:行特定条件列偏移
【发布时间】:2015-07-08 15:08:53
【问题描述】:

我正在尝试进行我无法解决的数据框转换。我从 stackoverflow 和 pandas 文档中尝试了多种方法:apply、apply(lambda: ...)、pivots 和 joins。在这里列出的尝试太多,但不确定哪种方法最好,或者我是否尝试了错误语法的正确方法。

基本上,我有一个数据框,我需要 1) 偏移列,2) 偏移的列数变化并取决于数据框中的变量,3) 在数据框的末尾创建列需要适应偏移量,以及 4) 在新创建的间隔中放置零。

df1 = pd.DataFrame({'first' : ['John', 'Mary', 'Larry', 'jerry'], '1' : [5.5, 6.0,10,20], '2' : [100, 200, 300, 400], '3' : [150, 100, 240, 110], 'offset' : ([1,0,2,1])})
goal_df = pd.DataFrame({'first' : ['John', 'Mary', 'Larry', 'jerry'], '1' : [0.0, 6.0, 0.0, 0], '2' : [5.5, 200, 0.0, 20], '3' : [100, 100, 10, 400], '4' : [150, 0.0, 300, 110], '5' : [0.0, 0.0, 240, 0.0]})

df1
1         2        3    first      offset
5.5      100      150    John       1
6.0      200      100    Mary       0
10.0     300      240    Larry      2
20.0     400      110    jerry      1


goal_df
1      2    3    4    5  first
0    5.5  100  150    0   John
6  200.0  100    0    0   Mary
0    0.0   10  300  240  Larry
0   20.0  400  110    0  jerry

这个数据集将有 c。 500 行和 c。 120 列。偏移量将非常介于 0-12 之间。我曾考虑使用基本的 Python 函数来执行此操作,但我也发现程序的困难和时间消耗会破坏最终目的,即删除在 Microsoft Excel 中完成的一些任务。

我经常抱怨 Excel 在这样的大型任务中表现不佳,但到目前为止,似乎 excel 中的当前电子表格 offset() 函数确实以一种非常易于使用的方式做到了这一点,但有数千个公式,是非常慢。我已经向我的工作场所出售了 Python 优于 Excel 的好处,这是我第一次真正的试验,所以速度对我来说非常重要,因为我试图让我的同事相信 Python 可以比当前的 excel 更快地吞噬这个电子表格文件大小为 96Mb。

我非常接近使用 melt() 函数,然后获取前列号并将偏移量添加到它们。但是,我在尝试使用枢轴改革数据框时遇到了很多问题。 apply 或 apply(lambda) 运气不好!

感谢任何人的帮助!

【问题讨论】:

    标签: python pandas dataframe offset


    【解决方案1】:

    这不是特别优雅或简洁,但应该可以解决问题。我发现在 numpy 中洗牌更容易一些(也应该更快一些),所以我首先从数据帧转换为数组。

    arr    = df1.values[:,:-2]    # just the numbers
    offset = df1.values[:,-1]     # just the offsets
    column_pad = 2
    arr2 = np.zeros( (arr.shape[0],arr.shape[1]+column_pad) )
    

    这是关键代码,它只是将每一行移动偏移量。

    for i, j in enumerate(offset):
        arr2[i,j:3+j] = arr[i]
    
    array([[   0. ,    5.5,  100. ,  150. ,    0. ],
           [   6. ,  200. ,  100. ,    0. ,    0. ],
           [   0. ,    0. ,   10. ,  300. ,  240. ],
           [   0. ,   20. ,  400. ,  110. ,    0. ]])
    

    除此之外,为列添加空间并将它们按正确的顺序放置只是一点点体力劳动。

    df2 = df1.copy()
    last_column = 6
    for i in map(str,range(3,last_column)):
        df2[i] = 0
    df2 = df2[ map(str,range(1,last_column))+['first','offset']]
    

    然后将 arr2 加载到 df2 中。

    df2.loc[:,'1':'5'] = arr2
    
       1      2    3    4    5  first  offset
    0  0    5.5  100  150    0   John       1
    1  6  200.0  100    0    0   Mary       0
    2  0    0.0   10  300  240  Larry       2
    3  0   20.0  400  110    0  jerry       1
    

    【讨论】:

    • 感谢您的浏览。我正在尝试您的解决方案,所以至少我有一些可行的方法。同时,我将尝试开发一种融合数据框和改变列号(旧列号+偏移量)的路径。唯一的问题是,当我“解开”数据框时,枢轴会完全搞砸一切。
    • @nordicray 好的,如果您更喜欢融合/旋转方式,您可能想发布您尝试过的内容,看看是否有人可以修复或改进它。
    • 谢谢@JohnE。我没有发布它的原因是因为每次我以为我很近时,我都会意识到我实际上有多远。我认为我需要做更多的研究,并真正了解 Pandas 中数据帧的多索引是如何工作的,然后再尝试更精简的版本。我也认为这对我正在研究的其他一些领域有帮助。
    猜你喜欢
    • 2020-05-27
    • 2022-11-24
    • 2017-08-06
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2022-06-15
    • 2018-12-17
    • 2017-12-15
    相关资源
    最近更新 更多