![](/img/trans.png)
[英]Add new column elements to explicitly to existing row in Pandas DataFrame (Python 2)
[英]Pandas Dataframe, add new column with range of data for each row in Python using Pandas
我有一個帶有單列的 dataframe,我想為 0-23 小時但為每一行創建一個名為“Hour”的新列。
當前的:
AN_LOG_ID
00000001
00000002
00000003
所需的 output:(每行每天每小時 0-23)
AN_LOG_ID HOUR
00000001 0
00000001 1
... ...
00000001 23
00000002 0
00000002 1
... ...
00000002 23
00000003 0
00000003 1
... ...
00000003 23
>>> df = df.assign(HOUR=[range(24)] * len(df)).explode("HOUR", ignore_index=True)
>>> df
AN_LOG_ID HOUR
0 00000001 0
1 00000001 1
2 00000001 2
3 00000001 3
4 00000001 4
.. ... ...
67 00000003 19
68 00000003 20
69 00000003 21
70 00000003 22
71 00000003 23
[72 rows x 2 columns]
首先將range(24)
分配給每一行作為“HOUR”,然后展開該“HOUR”列以在其自己的行上展開小時數。 (ignore_index=True 使結果索引為 0, 1, 2, ...)
我們可以使用Index.repeat
然后使用groupby.cumcount
來獲取您的HOUR
列:
df = df.loc[df.index.repeat(24)]
df = df.assign(HOUR=df.groupby(level=0).cumcount()).reset_index(drop=True)
N_LOG_ID HOUR
0 00000001 0
1 00000001 1
2 00000001 2
3 00000001 3
4 00000001 4
.. ... ...
67 00000003 19
68 00000003 20
69 00000003 21
70 00000003 22
71 00000003 23
使用交叉merge
:
out = df.merge(pd.DataFrame({'HOUR': range(24)}), how='cross')
Output:
AN_LOG_ID HOUR
0 00000001 0
1 00000001 1
2 00000001 2
3 00000001 3
4 00000001 4
.. ... ...
67 00000003 19
68 00000003 20
69 00000003 21
70 00000003 22
71 00000003 23
[72 rows x 2 columns]
另一種可能的解決方案,基於numpy
:
pd.DataFrame(
np.concatenate(
(np.repeat(df.values, 24).reshape(-1,1),
np.tile(np.arange(24), len(df)).reshape(-1,1)), axis=1),
columns=['AN_LOG_ID', 'HOUR'])
Output:
AN_LOG_ID HOUR
0 00000001 0
1 00000001 1
2 00000001 2
3 00000001 3
4 00000001 4
.. ... ...
67 00000003 19
68 00000003 20
69 00000003 21
70 00000003 22
71 00000003 23
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.