【问题标题】:Swapping rows within the same pandas dataframe在同一个熊猫数据框中交换行
【发布时间】:2018-04-04 02:19:25
【问题描述】:

我正在尝试在 pandas 中交换同一 DataFrame 中的行。

我试过跑步

a = pd.DataFrame(data = [[1,2],[3,4]], index=range(2), columns = ['A', 'B'])
b, c = a.iloc[0], a.iloc[1]
a.iloc[0], a.iloc[1] = c, b

但我最终得到的两行都显示了第二行 (3,4) 的值。

即使变量 b 和 c 现在都分配给 3 和 4,即使我没有再次分配它们。我做错了吗?

【问题讨论】:

    标签: python pandas dataframe rows swap


    【解决方案1】:

    使用.copy() 使用临时变量来存储值,因为您在链上分配值时正在更改值,即除非您使用复制,否则数据将直接更改。

    a = pd.DataFrame(data = [[1,2],[3,4]], index=range(2), columns = ['A', 'B'])
    b, c = a.iloc[0], a.iloc[1]
    
    
    temp = a.iloc[0].copy()
    a.iloc[0] = c
    a.iloc[1] = temp
    

    或者你可以直接使用copy like

    a = pd.DataFrame(data = [[1,2],[3,4]], index=range(2), columns = ['A', 'B'])
    b, c = a.iloc[0].copy(), a.iloc[1].copy()
    a.iloc[0],a.iloc[1] = c,b
    

    【讨论】:

    • 哦,是的,这解决了问题。非常感谢!我仍然不确定价值何时在链上。你会说在我分配新变量时总是使用.copy() 方法会更安全吗?
    • 是的,默认情况下它们持有对 main object 的引用。您所做的任何更改都会反映在主要对象上。所以你需要副本。
    【解决方案2】:

    接受的答案不会更改索引名称。

    如果您只想更改行的顺序,您应该使用dataframe.reindex(arraylike)。请注意索引已更改。

    【讨论】:

    • 是的,使用.reindex() 就是一个。
    【解决方案3】:

    通过这种方式,可以外推到更复杂的情况:

    a = pd.DataFrame(data = [[1,2],[3,4]], index=range(2), columns = ['A', 'B'])
    rows = a.index.to_list()
    # Move the last row to the first index
    rows = rows[-1:]+rows[:-1]
    a=a.loc[rows]
    

    【讨论】:

      【解决方案4】:
      df = pd.DataFrame(data = [[1,2],[4,5],[6,7]], index=['a','b','c'], columns = ['A', 'B'])
      

      df

      df.reindex(['a','c','b'])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 2017-03-24
        • 2021-05-27
        • 2022-11-18
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多