我有兩個 data.frames(df1 和二進制 df2),我想基于以二進制 data.frame df2 為條件的 df1 創建第三個 data.frame (df3)。如果在二進制 data.frame 2 中的那個位置有一個零,我想將所有值設定為零。
import pandas as pd
df1 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':['1.2', '2.3', '0.3', '0.5'],
'02K W':['3.5', '0.1', 'nan', 'nan'],
'03K W':['4.2', '5.2', '2.5', '3.0'],
'04K W':['1.5', '2.6', '8.2', '4.2']})
df2 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':['1', '1', '1', '1'],
'02K W':['1', '0', '0', '0'],
'03K W':['0', '0', '0', '1'],
'04K W':['0', '1', '1', '0']})
為了創建新的 data.frame 3,我正在考慮對列進行 for 回圈并根據 df2(值 = 0)替換 df1 中的值。到目前為止,我無法找出正確的語法。
df3 = for col in df1.columns:
if df2[col].value[1:] == 0:
df3[col].value[1:] = 0
else:
df3[col].value[1:] = df1[col].value
我希望 data.frame 看起來像這樣:
df3 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':['1.2', '2.3', '0.3', '0.5'],
'02K W':['3.5', '0', '0', '0'],
'03K W':['0', '0', '0', '3.0'],
'04K W':['0', '2.6', '8.2', '0']})
非常感謝您的幫助 :)
uj5u.com熱心網友回復:
您可以通過 df2 索引 df1。由于 df2 是字串 dtype,首先轉換為布林值。
df2_bool = df2.set_index('Date').astype(int).astype(bool)
df1.set_index('Date')[df2_bool].fillna(0).reset_index()
你得到
Date 01K W 02K W 03K W 04K W
0 2021-01-01 1.2 3.5 0 0
1 2021-01-02 2.3 0 0 2.6
2 2021-01-03 0.3 0 0 8.2
3 2021-01-04 0.5 0 3.0 0
當然,您可以將其設為一行(并避免保存布林值 df2)
df1.set_index('Date')[df2.set_index('Date').astype(int).astype(bool)].fillna(0).reset_index()
uj5u.com熱心網友回復:
你可以這樣做:
bm = df2.sort_values('Date').set_index('Date').astype(int).astype(bool).values
df1.sort_values('Date').set_index('Date').where(bm, 0).reset_index()
基本上你創建一個二進制矩陣:
df2.sort_values('Date').set_index('Date').astype(int).astype(bool).values
然后你使用熊貓 where 子句。
注意:這僅在所有日期都在df1和 中時才有效df2。
uj5u.com熱心網友回復:
下面的代碼將起作用。
df1 = df1.set_index('Date').astype(float)
df2 = df2.set_index('Date').astype(float)
df1.fillna(0,inplace=True)
df3 = df1 * df2
如果 df2 也有空值,您可以使用 fillna()。
該操作是一個簡單的矩陣乘法。
你也可以這樣做。
df1.mul(df2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343734.html
