【问题标题】:append pandas dataframe to column将熊猫数据框附加到列
【发布时间】:2017-03-03 20:44:53
【问题描述】:

我被困住了,需要一些帮助。我有以下数据框:

+-----+---+---+--+--+
|     | A | B |  |  |
+-----+---+---+--+--+
| 288 | 1 | 4 |  |  |
+-----+---+---+--+--+
| 245 | 2 | 3 |  |  |
+-----+---+---+--+--+
| 543 | 3 | 6 |  |  |
+-----+---+---+--+--+
| 867 | 1 | 9 |  |  |
+-----+---+---+--+--+
| 345 | 2 | 7 |  |  |
+-----+---+---+--+--+
| 122 | 3 | 8 |  |  |
+-----+---+---+--+--+
| 233 | 1 | 1 |  |  |
+-----+---+---+--+--+
| 346 | 2 | 6 |  |  |
+-----+---+---+--+--+
| 765 | 3 | 3 |  |  |
+-----+---+---+--+--+

A 列有重复值,如图所示。我想要做的是每次我在 A 列中看到重复值时,我想将一个新列与 B 列中的相应值追加为 C 列,如下所示:

+-----+---+---+-----+
|     | A | B | C   |
+-----+---+---+-----+
| 288 | 1 | 4 | 9   |
+-----+---+---+-----+
| 245 | 2 | 3 | 7   |
+-----+---+---+-----+
| 543 | 3 | 6 | 8   |
+-----+---+---+-----+
| 867 | 1 | 9 | 1   |
+-----+---+---+-----+
| 345 | 2 | 7 | 6   |
+-----+---+---+-----+
| 122 | 3 | 8 | 3   |
+-----+---+---+-----+
| 233 | 1 | 1 | NaN |
+-----+---+---+-----+
| 346 | 2 | 6 | NaN |
+-----+---+---+-----+
| 765 | 3 | 3 | NaN |
+-----+---+---+-----+

谢谢。

【问题讨论】:

  • 你的尝试在哪里?
  • 听起来你最好的办法是操纵df.groupby('A')的输出

标签: python pandas jupyter-notebook


【解决方案1】:

假设val是重复值之一,

slice = df.loc[df.A == val, 'B'].shift(-1)

将创建一个单列数据框,其中的值重新索引到它们的新位置。

由于重新分配的索引值都不应该是多余的,您可以使用pandas.concat 将不同的切片拼接在一起,而不必担心丢失数据。然后将它们附加为新列:

df['C'] = pd.concat([df.loc[df['A'] == x, 'B'].shift(-1) for x in [1, 2, 3]])

分配列时,索引值将使所有内容对齐:

A  B    C
0  1  4  9.0
1  2  3  7.0
2  3  6  8.0
3  1  9  1.0
4  2  7  6.0
5  3  8  3.0
6  1  1  NaN
7  2  6  NaN
8  3  3  NaN

【讨论】:

    【解决方案2】:

    反转数据帧顺序,根据移位函数对其进行分组转换,然后将其反转:

    df = df[::-1]
    df['C'] = df.groupby(df.columns[0]).transform('shift')
    df = df[::-1]
    df
    
        A    B     C
    0    1    4  9.0
    1    2    3  7.0
    2    3    6  8.0
    3    1    9  1.0
    4    2    7  6.0
    5    3    8  3.0
    6    1    1  NaN
    7    2    6  NaN
    8    3    3  NaN
    

    【讨论】:

      猜你喜欢
      • 2014-01-03
      • 2018-02-08
      • 2017-06-13
      • 2019-01-14
      • 2019-10-22
      • 1970-01-01
      • 2021-09-24
      • 2022-11-25
      • 2020-05-21
      相关资源
      最近更新 更多