我有2個資料框如下:
d = {'col1': [1, 2, 3, 4], 'col2': ["2010-01-01", "2011-01-01", "2012-01-01", "2013-01-01"]}
df = pd.DataFrame(data=d)
df
col1 col2
0 1 2010-01-01
1 2 2011-01-01
2 3 2012-01-01
3 4 2013-01-01
另一個資料框可能如下所示:
d2 = {'col1': [11, 22, 33, 44], 'col1': ["2011-01-01", "2011-05-01", "2012-02-01", "2012-06-01"]}
df2 = pd.DataFrame(data=d2)
df2
col1 col2
0 11 2011-01-01
1 22 2011-05-01
2 33 2012-02-01
3 44 2012-06-01
在這兩個資料框中,col2都包含日期(以字串格式,而不是日期物件),并且這些日期按升序排列。
在我的用例中,這兩個資料幀都應該以col2中的相同值開頭。
df的第一個 col2 值為"2010-01-01"。df2的第一個 col2 值為"2011-01-01"。在此特定示例中,由于df2中不存在“2010-01-01” ,并且“2011-01-01”是 df 資料幀中 col2 的第二行專案,因此需要洗掉df的第一行,以便兩個資料幀從col2中的相同日期字串值開始。因此, df 在更改后應該如下所示:
col1 col2
1 2 2011-01-01
2 3 2012-01-01
3 4 2013-01-01
(請注意,更改后索引不會重置。)
但是,這可能是相反的,我們可能需要從 df2 中洗掉行,而不是能夠使這些資料幀以 col2 中的相同值開始。
在某些情況下,我們可能需要從資料框中洗掉多行,而不僅僅是 1 行,以防我們在第二行中找不到匹配項。
極端情況處理:邏輯還應該處理這樣的情況(不拋出錯誤),如果不匹配,則不可能使這 2 個資料幀以相同的 col2 值開頭。在這種情況下,兩個資料幀中的所有行都應該被洗掉。
是否有一種無需撰寫太多代碼行即可開發此邏輯的優雅方法?
uj5u.com熱心網友回復:
首先在兩個 DataFrame 中獲取最小值,然后通過比較值來datetime過濾兩個 s 中該行之后的所有行DataFrame(因為可能從df1or中洗掉某些行) 。如果不匹配,則兩個 DataFrame 都為空。df2bothSeries.cummax
both = df.merge(df2, on='col2')['col2'].min()
df = df[df['col2'].eq(both).cummax()]
print (df)
col1 col2
1 2 2011-01-01
2 3 2012-01-01
3 4 2013-01-01
df2 = df2[df2['col2'].eq(both).cummax()]
print (df2)
col1 col2
0 11 2011-01-01
1 22 2011-05-01
2 33 2012-02-01
3 44 2013-01-01
#no match df2.col2 in df.col2
d2 = {'col1': [11, 22, 33, 44], 'col2': ["2011-01-21", "2011-05-01",
"2012-02-01", "2003-01-01"]}
df2 = pd.DataFrame(data=d2)
both = df.merge(df2, on='col2')['col2'].min()
df = df[df['col2'].eq(both).cummax()]
print (df)
Empty DataFrame
Columns: [col1, col2]
Index: []
df2 = df2[df2['col2'].eq(both).cummax()]
print (df2)
Empty DataFrame
Columns: [col1, col2]
Index: []
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/465466.html
標籤:Python python-3.x 熊猫 数据框
上一篇:基于時間的比例計算
