這是我的資料框:
| 身份證號碼 | 購買日期 |
|---|---|
| 1 | 2022-05-01 |
| 1 | 2021-03-03 |
| 1 | 2020-01-03 |
| 2 | 2019-01-03 |
| 2 | 2018-01-03 |
我想獲得一個水平資料框,其中每個 ID 號的所有日期都在單獨的列中。
所以像這樣:
| 身份證號碼 | 日期 1 | 日期 2 | 日期 3 |
|---|---|---|---|
| 1 | 2022-05-01 | 2021-03-03 | 2020-01-03 |
| 2 | 2019-01-03 | 2018-01-03 |
在我這樣做之后,我想計算這些日期之間的差異。
uj5u.com熱心網友回復:
第一步GroupBy.cumcount是DataFrame.pivot:
df['Date purchase'] = pd.to_datetime(df['Date purchase'])
df1 = (df.sort_values(by=['ID number', 'Date purchase'], ascending=[True, False])
.assign(g=lambda x: x.groupby('ID number').cumcount())
.pivot('ID number','g','Date purchase')
.rename(columns = lambda x: f'Date {x 1}'))
print (df1)
g Date 1 Date 2 Date 3
ID number
1 2022-05-01 2021-03-03 2020-01-03
2 2019-01-03 2018-01-03 NaT
然后對于列之間的差異,請使用DataFrame.diff:
df2 = df1.diff(-1, axis=1)
print (df2)
g Date 1 Date 2 Date 3
ID number
1 424 days 425 days NaT
2 365 days NaT NaT
如果需要平均值:
df3 = df1.apply(pd.Series.mean, axis=1).reset_index(name='Avg Dates').rename_axis(None, axis=1)
print (df3)
ID number Avg Dates
0 1 2021-03-02 16:00:00
1 2 2018-07-04 12:00:00
uj5u.com熱心網友回復:
你能做這樣的事情嗎?
def format_dataframe(df):
"""
Function formats the dataframe to the following:
| ID number| Date 1 | Date 2 | Date 3 |
| -------- | -------------- | -------------- | -------------- |
| 1 | 2022-05-01 | 2021-03-03 | 2020-01-03 |
| 2 | 2019-01-03 | 2018-01-03 | |
"""
df = df.sort_values(by=['ID number', 'Date purchase'])
df = df.drop_duplicates(subset=['ID number'], keep='first')
df = df.drop(columns=['Date purchase'])
df = df.rename(columns={'ID number': 'ID number', 'Date 1': 'Date 1', 'Date 2': 'Date 2', 'Date 3': 'Date 3'})
return df
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461316.html
上一篇:如何將Dataframe的顯式列與單個列分開并添加新標題?
下一篇:如何將虛擬變數列轉換為多列?
