簡體   English   中英

當當前行和先前行中的名稱(A 列中)匹配時,如何創建具有先前值(B 列中)的列?

[英]How do I create a column with a previous value (in column B) when the names (in column A) in current and previous rows matches?

我想創建一個新列,復制“值”列中的值,該值對應於“名稱”列中的同一個人,但來自具有相同名稱的前一行。 當那個人沒有以前的值時,我想留下一個空字符串。

我嘗試使用此代碼,但它不起作用:

previous_value= []
col_list = df['Name'].values.tolist()

for idx in df.index:
    last_name= df['Name'].loc[idx] 
    last_value= df['Value'].loc[idx]
    
    for i in range(len(col_list)-1):
        actual_name= col_list[i+1]
        if last_name == actual_name:
            previous_value.append(last_value)
        else:
            previous_followers.append("")

我的想法是稍后將 previous_value 列表轉換為數據框,然后將其添加到原始數據框。

它應該是這樣的:


        Name    Value   Previous_value
1      Andrew   12         
2      Marco    10          
3      Philips   9 
4      Andrew    8           12
5      Oscar     7     
6      Peter    15    
7      Maria    25
8      Marco     3           10
9      Andrew    7           8
10     Oscar    19           7
11     Oscar    21          19
12     Maria     2          25

謝謝

這個問題之前在這里得到了回答。 您可以使用groupbyshift來實現此目的(盡管默認情況下您將獲得第一個條目的 NaN,而不是空字符串。

df = pd.DataFrame({'Name':[1,2,3,1,2,3,1,2,3],'Value':[0,1,2,3,4,5,6,7,8]})
df['Previous_Value'] = df.groupby('Name')['Value'].shift()

For 循環通常不能很好地與 pandas 混合使用。在這種情況下,您希望按名稱分組,然后將值向下移動一個以創建先前的值列。 這應該可以解決問題:

>>> df['previous_value'] = df.groupby('Name')['Value'].shift()
>>> df
       Name  Value  previous_value
0    Andrew     12             NaN
1     Marco     10             NaN
2   Philips      9             NaN
3    Andrew      8            12.0
4     Oscar      7             NaN
5     Peter     15             NaN
6     Maria     25             NaN
7     Marco      3            10.0
8    Andrew      9             8.0
9     Oscar     19             7.0
10    Oscar     21            19.0
11    Maria      2            25.0

然后,如果需要,您可以在新列上使用fillna('')將 NaN 替換為空字符串。

暫無
暫無

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

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