簡體   English   中英

將pandas數據框附加到列

[英]append pandas dataframe to column

我被困住了,需要一些幫助。 我有以下數據幀:

+-----+---+---+--+--+
|     | 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具有重復值,如圖所示。 我想要做的是每當我看到列AI中的重復值想要附加一個新列時,列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 |
+-----+---+---+-----+

謝謝。

假設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

反轉數據幀順序,groupby將其轉換為shift函數,然后將其反轉:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM