【问题标题】:Python Pandas Dataframe duplicate and reorder a columnPython Pandas Dataframe 复制并重新排序列
【发布时间】:2017-08-03 10:39:04
【问题描述】:

我有一个(可能)非常简单的问题。我有以下数据框:

c1 | c2 | c3

一个 |乙 | 4
乙 |一个 | 1

现在 column3 仅依赖于 column1 并且 column2 与 column1 具有相同的项目,但顺序不同。我要做的就是添加一个具有相同column3值但按column2顺序排列的column4。所以结果应该是这样的:

c1| c2| c3|c4

a | b | 4 | 1             
b | a | 1 | 4

你有什么想法吗?

提前致谢!

【问题讨论】:

  • same values of column3 but in order of column2 此处 column2 的顺序是什么意思。它是按第 2 列排序的吗??

标签: python pandas dataframe


【解决方案1】:

如果值是唯一的:

df['c4'] = df.set_index('c1').loc[df['c2'], 'c3'].values
print (df)
  c1 c2  c3  c4
0  a  b   4   1
1  b  a   1   4

如果没有,那就有点复杂了,因为需要cumcount 来创建唯一的MultiIndex 然后reindex

print (df)
  c1 c2  c3
0  a  b   5
1  a  a   4
2  b  a   1

a = df.groupby('c1').cumcount()
idx = pd.MultiIndex.from_arrays([df.groupby('c2').cumcount(), df['c2']])
print (idx)
MultiIndex(levels=[[0, 1], ['a', 'b']],
           labels=[[0, 0, 1], [1, 0, 0]],
           names=[None, 'c2'])

df['c4'] = df.set_index([a,'c1']).reindex(idx)['c3'].values
print (df)
  c1 c2  c3  c4
0  a  b   5   1
1  a  a   4   5
2  b  a   1   4

【讨论】:

  • 你怎么总是这么快回答这些问题?你从不睡觉?
  • 现在是 12:44,所以我晚上睡觉 :)
  • 帅哥。我是一个超级粉丝。每当出现熊猫问题时,当我复制数据框时,您的答案就在其中。:)
  • 哈哈哇,这比预期的要快得多:D 太棒了,非常感谢!
  • 啊不等对不起,这些值不是唯一的 :( 所以在 c1 和 c2 中是相同的值,但多次和不同的顺序。总体目标实际上是复制所有其他依赖列c1 到 c2 的顺序。
【解决方案2】:

不如@jezrael 回答好,但有效:

df['c4'] = df.apply(lambda x: dict(zip(df['c1'], df['c3'])).get(x['c2']), axis=1)

  c1 c2  c3  c4
0  a  b   4   1
1  b  a   1   4

【讨论】:

    猜你喜欢
    • 2018-02-14
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 2018-02-24
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多