Start我有一個資料框,其中兩列End是日期串列。我想做的是創建兩個單獨的資料框,對于第一個資料框,列中的第一個值與Start列中的值匹配End,而對于第二個資料框,列中的第二個值Start也與列中的值匹配End。
基本上,如果列中有兩個值Start,那么只要End列中的日期在第一個日期之后和第二個日期之前(如下例中的 BBB 行所示),那么我想將這些值放入兩個單獨的資料框。此外,即使End列中沒有日期(如下例中的 EEE 行),我仍然想拆分它。Start最后,如果和列中的一個或兩個End為空,則它們將保存在兩個資料框中。
例如,對于下面的資料框:
Name Start End
AAA 2017-09-13
BBB 2021-11-20, 2022-06-04 2022-04-07
CCC 2022-09-29
DDD
EEE 2021-04-28, 2022-06-14
我試圖讓第一個資料框看起來像這樣:
Name Start End
AAA 2017-09-13
BBB 2021-11-20 2022-04-07
CCC 2022-09-29
DDD
EEE 2021-04-28
第二個資料框看起來像這樣:
Name Start End
AAA 2016-09-13
BBB 2022-06-04 2022-04-07
CCC 2022-09-29
DDD
EEE 2022-06-14
如果Start和End列中的日期不在串列中,那會稍微容易一些,但到目前為止,我發現很難想到一種計算上快速的方法,所以任何幫助將不勝感激,謝謝!
uj5u.com熱心網友回復:
您可以使用:
tmp_df = df.assign(Start=df['Start'].str.split(',')).explode('Start')
df1 = tmp_df.groupby(level=0).first()
df2 = tmp_df.groupby(level=0).last()
注意。如果您已經有串列,則可以跳過.assign(Start=df['Start'].str.split(',')).
輸出:
# df1
Name Start End
0 AAA 2017-09-13 None
1 BBB 2021-11-20 2022-04-07
2 CCC None 2022-09-29
3 DDD None None
4 EEE 2021-04-28 None
# df2
Name Start End
0 AAA 2017-09-13 None
1 BBB 2022-06-04 2022-04-07
2 CCC None 2022-09-29
3 DDD None None
4 EEE 2022-06-14 None
uj5u.com熱心網友回復:
我要做的是根據您擁有的日期創建兩個不同的列,然后您可以創建所需的 dfs。為此,我將為每種情況定義兩個不同的函式,以應用于帶有地圖的矢量化,如下所示:
def first(date) -> str:
return str(date).split(", ")[0]
def second(date:str) -> str:
return str(date).split(", ")[1]
df["first_date"] = df["start"].apply(first)
df["second_date"] = df["start"].apply(second)
考慮到您現在應該管理空字串,但作為解決問題的第一種方法,它應該會給您一些啟示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/521354.html
上一篇:Flutter自定義日期格式
