我有一個看起來像這樣的資料框:
| Col1 | 氯氣 | C3 |
|---|---|---|
| 2018 年 12 月 31 日 | 2018 年 9 月 30 日 | 2018 年 11 月 30 日 |
| 2019 年 1 月 31 日 | 2018 年 10 月 31 日 | 2019 年 4 月 30 日 |
| 2019 年 2 月 28 日 | 2018 年 11 月 30 日 | 2020 年 11 月 30 日 |
我希望根據行值重新排列它,所以它變成:
| Col1 | 氯氣 | C3 |
|---|---|---|
| 楠 | 2018 年 9 月 30 日 | 楠 |
| 楠 | 2018 年 10 月 31 日 | 楠 |
| 楠 | 2018 年 11 月 30 日 | 2018 年 11 月 30 日 |
| 2018 年 12 月 31 日 | 楠 | 楠 |
| 2019 年 1 月 31 日 | 楠 | 楠 |
| 2019 年 2 月 28 日 | 楠 | 楠 |
| 楠 | 楠 | 2019 年 4 月 30 日 |
| 楠 | 楠 | 2020 年 11 月 30 日 |
從上面,我們可以注意到所有行必須有相同的日期,否則,我們用某種 Nan 填充它們。我還希望這個想法可以適用于任意數量的列、任意數量的行和任何列名(通用的想法)。
如果有幫助:
import numpy as np
import pandas as pd
# Create the pandas DataFrame
df1 = pd.DataFrame(['2018-12-31','2019-01-31','2019-02-28'], columns = ['Col1'])
df2 = pd.DataFrame(['2018-09-30','2018-10-31','2018-11-30'], columns = ['Cl2'])
df3 = pd.DataFrame(['2018-11-30','2019-04-30','2020-11-30'], columns = ['C3'])
data = {'Col1': [np.nan,np.nan,np.nan,'2018-12-31','2019-01-31','2019-02-28',np.nan,np.nan],
'Cl2': ['2018-09-30','2018-10-31','2018-11-30',np.nan,np.nan,np.nan,np.nan,np.nan],
'C3': [np.nan,np.nan,'2018-11-30',np.nan,np.nan,np.nan,'2019-04-30','2020-11-30']}
desired_df = pd.DataFrame(data)
desired_df
注意:這有點類似于我之前在此處發布的問題
uj5u.com熱心網友回復:
您可以將列設定為索引,然后添加一個虛擬列
for df in [df1, df2, df3]:
df.set_index(df.columns[0], inplace=True)
df[df.index.name] = 1
print(df1)
Col1
Col1
2018-12-31 1
2019-01-31 1
2019-02-28 1
然后連接所有轉換后的資料幀并對索引進行排序
df = pd.concat([df1, df2, df3], axis=1).sort_index()
print(df)
Col1 Cl2 C3
2018-09-30 NaN 1.0 NaN
2018-10-31 NaN 1.0 NaN
2018-11-30 NaN 1.0 1.0
2018-12-31 1.0 NaN NaN
2019-01-31 1.0 NaN NaN
2019-02-28 1.0 NaN NaN
2019-04-30 NaN NaN 1.0
2020-11-30 NaN NaN 1.0
最后,將所有的 1 替換為對應的索引
df = df.apply(lambda col: col.mask(col.eq(1), df.index), axis=0).reset_index(drop=True)
print(df)
Col1 Cl2 C3
0 NaN 2018-09-30 NaN
1 NaN 2018-10-31 NaN
2 NaN 2018-11-30 2018-11-30
3 2018-12-31 NaN NaN
4 2019-01-31 NaN NaN
5 2019-02-28 NaN NaN
6 NaN NaN 2019-04-30
7 NaN NaN 2020-11-30
用更少的線
df = pd.concat([df.set_index(df.columns[0]).assign(**{f'{df.columns[0]}': 1}) for df in [df1, df2, df3]], axis=1).sort_index()
df = df.apply(lambda col: col.mask(col.eq(1), df.index), axis=0).reset_index(drop=True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461333.html
