我用熊貓創建了一個資料框:
看起來像這樣:
| 主機名 | 日期 |
|---|---|
| 乙 | 2021-01-01 12:30 |
| 一個 | 2021-01-01 12:45 |
| C | 2021-01-01 12:46 |
| 一個 | 2021-02-01 12:42 |
| 乙 | 2021-02-01 12:43 |
| 一個 | 2021-02-01 12:45 |
| 乙 | 2021-02-25 12:46 |
| C | 2021-03-01 12:41 |
| 一個 | 2021-03-01 12:42 |
| 一個 | 2021-03-01 12:43 |
| C | 2021-03-01 12:45 |
對于每一天,它應該計算從一天的開始(例如:2021-01-01 00:00)到特定行有多少不同的 HostName
示例: 例如讓我們采取 2021-01-01
| 主機名 | 日期 |
|---|---|
| 乙 | 2021-01-01 12:30 |
| 一個 | 2021-01-01 12:45 |
| C | 2021-01-01 12:46 |
有樹行:
- 第一個結果是 1 - 因為它是當天的第一行。(B)
- 第二個結果是 2 - 因為從一天開始到這一行有兩個不同的主機名 (B,A)
- 第三個結果將是 3 - 因為從一天的開始直到這一行有樹不同的主機名(B,A,C)
最終結果應如下所示:
| 主機名 | 日期 | 結果 |
|---|---|---|
| 乙 | 2021-01-01 12:30 | 1 |
| 一個 | 2021-01-01 12:45 | 2 |
| C | 2021-01-01 12:46 | 3 |
| 一個 | 2021-02-01 12:42 | 1 |
| 乙 | 2021-02-01 12:43 | 2 |
| 一個 | 2021-02-01 12:45 | 2 |
| 乙 | 2021-02-25 12:46 | 1 |
| C | 2021-03-01 12:41 | 1 |
| 一個 | 2021-03-01 12:42 | 2 |
| 一個 | 2021-03-01 12:43 | 2 |
| C | 2021-03-01 12:45 | 2 |
它嘗試做什么但失敗了:
df.groupby(['HostName','Date')['HostName'].cumcount() 1
或者
def f(x):
one = x['HostName'].to_numpy()
twe = x['Date'].to_numpy()
both = x[['HostName','Date']].shift(1).to_numpy()
x['Host_1D_CumCount_Conn'] = [np.sum((one == a) & (twe == b)) for a, b in both]
return x
df.groupby('HostName').apply(f)
uj5u.com熱心網友回復:
將 lambda 函式GroupBy.transform與 lambda 函式與Series.duplicated累積和一起使用:
df['Result'] = (df.groupby(df['Date'].dt.date)['HostName']
.transform(lambda x: (~x.duplicated()).cumsum()))
print (df)
HostName Date Result
0 B 2021-01-01 12:30:00 1
1 A 2021-01-01 12:45:00 2
2 C 2021-01-01 12:46:00 3
3 A 2021-02-01 12:42:00 1
4 B 2021-02-01 12:43:00 2
5 A 2021-02-01 12:45:00 2
6 B 2021-02-25 12:46:00 1
7 C 2021-03-01 12:41:00 1
8 A 2021-03-01 12:42:00 2
9 A 2021-03-01 12:43:00 2
10 C 2021-03-01 12:45:00 2
更快的替代解決方案是d為每個日期和重復項創建輔助列d,HostName并使用GroupBy.cumsum:
df['Result'] = (df.assign(d = df['Date'].dt.date,
new = lambda x: ~x.duplicated(['d','HostName']))
.groupby('d')['new']
.cumsum())
print (df)
HostName Date Result
0 B 2021-01-01 12:30:00 1
1 A 2021-01-01 12:45:00 2
2 C 2021-01-01 12:46:00 3
3 A 2021-02-01 12:42:00 1
4 B 2021-02-01 12:43:00 2
5 A 2021-02-01 12:45:00 2
6 B 2021-02-25 12:46:00 1
7 C 2021-03-01 12:41:00 1
8 A 2021-03-01 12:42:00 2
9 A 2021-03-01 12:43:00 2
10 C 2021-03-01 12:45:00 2
uj5u.com熱心網友回復:
您可以groupby日期并使用expanding nunique。問題是,目前,擴展只適用于數值(我希望我們可以簡單地做expanding().nunique())。
因此,我們必須factorize在申請前欺騙一下數字列pd.Series.nunique。
df['Result'] = (df.groupby(pd.to_datetime(df['Date']).dt.date, group_keys=False)
['HostName']
.apply(lambda s: pd.Series(s.factorize()[0]).expanding().apply(pd.Series.nunique))
.astype(int)
.values
)
輸出:
HostName Date Result
0 B 2021-01-01 12:30 1
1 A 2021-01-01 12:45 2
2 C 2021-01-01 12:46 3
3 A 2021-02-01 12:42 1
4 B 2021-02-01 12:43 2
5 A 2021-02-01 12:45 2
6 B 2021-02-25 12:46 1
7 C 2021-03-01 12:41 1
8 A 2021-03-01 12:42 2
9 A 2021-03-01 12:43 2
10 C 2021-03-01 12:45 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/409852.html
標籤:
上一篇:如何在合并1000多個檔案時將csv檔案的名稱添加為列中的值?
下一篇:回傳熊貓資料框每一行中組的大小
