簡體   English   中英

如何用另一個數據框列切片中的值替換數據框列的切片?

[英]How do I replace a slice of a dataframe column with values from another dataframe column slice?

我有兩個數據框,其中包含多個列,包括時間戳列。 我想將前 1000 個時間戳從第二個數據幀復制到第一個。

df1 = pd.read_csv(file1.csv)
df2 = pd.read_csv(file2.csv)
df1.timestamp.iloc[:1000] = df2.timestamp.iloc[:1000]  

我嘗試了各種方法,例如將.copy()添加到右側,使用.loc[:1000, 'timestamp']而不是 columnname.iloc 語法,首先將列序列轉換為 numpy 數組,但我不斷收到錯誤從“太多索引器”到使用 .loc[rowindexing, columnindexing] 的指令(不能解決問題)和其他錯誤消息。

使用Index.get_loc按名稱獲取列的位置,因此可以傳遞給DataFrame.iloc

s = df2.iloc[:1000, df2.columns.get_loc('timestamp')]  
df1.iloc[:1000, df1.columns.get_loc('timestamp')] = s

或者,如果使用帶有切片索引的DataFrame.loc ,但僅當兩個 DataFrame 的長度都大於1000時才有效:

df1.loc[:df1.index[1000], 'timestamp'] = df2.loc[:df2.index[1000], 'timestamp']

我認為您的解決方案失敗了,因為 DataFrames 的長度不同。

樣品

df1 = pd.DataFrame({ "timestamp" : [2000, 2001, 2002, 2003, 1990, 1991,
                                    1992, 1993, 1994, 2010, 2011, 2012]})
df2 = pd.DataFrame({
        'A':list('abcdef'),
         'timestamp':[4,5,4,5,5,4],
})

s = df2.iloc[:1000, df2.columns.get_loc('timestamp')]  
df1.iloc[:1000, df1.columns.get_loc('timestamp')] = s
print (df1)
    timestamp
0         4.0
1         5.0
2         4.0
3         5.0
4         5.0
5         4.0
6         NaN
7         NaN
8         NaN
9         NaN
10        NaN
11        NaN

df1 = pd.DataFrame({ "timestamp" : [2000, 2001, 2002, 2003, 1990, 1991,
                                    1992, 1993, 1994, 2010, 2011, 2012]})
df2 = pd.DataFrame({
        'A':list('abcdef'),
         'timestamp':[4,5,4,5,5,4],
})

s = df1.iloc[:1000, df1.columns.get_loc('timestamp')]  
df2.iloc[:1000, df2.columns.get_loc('timestamp')] = s

print (df2)
   A  timestamp
0  a       2000
1  b       2001
2  c       2002
3  d       2003
4  e       1990
5  f       1991

給定 df1,df2:

df1 = pd.DataFrame({'timestamp': range(0,2000)})
df2 = -df1

使用 .loc:

df1.loc[:999,'timestamp'] = df2.loc[:999,'timestamp']
df1.loc[997:1002,'timestamp']

997     -997
998     -998
999     -999
1000    1000
1001    1001
1002    1002
Name: timestamp, dtype: int64

或使用 iloc (可選地使用 get_loc 轉換 loc -> get_loc

df1.iloc[:1000,0] = df2.iloc[:1000,0]
df1.loc[997:1002,'timestamp']

997     -997
998     -998
999     -999
1000    1000
1001    1001
1002    1002
Name: timestamp, dtype: int64

請注意, iloc 和 loc 上的切片行為是不同的。
.loc包含正確的值, .iloc不包含它(例如在范圍內)

暫無
暫無

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

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