我有 2 個資料框
df:ServicesA df:ServicesB
index clientID ServiceID_A | index ClientID ServiceID_B
0 A 1 | 0 A 4
1 B 2 | 1 B 5
2 C 3 | 2 D 6
2 B 4 |
我想獲得一個新的 df,在 df:ServicesB 上顯示這些客戶端以及這些客戶端有多少個 servicesA。這將是這樣的
index ClientID With ServiceID_B count(ServiceID_A)
0 A 1
1 B 2
2 D 0
我試過這個:
我從 df:ServicesB 獲得了一個唯一的客戶端 ID 串列,并創建了一個名為“df”的新 df
df = pd.DataFrame(df_ServicesB['Client ID', ].unique(),columns=['Client ID'])
然后我使用這個 lambda 函式,它會從 df 中獲取每個客戶端 id 并遍歷 df:ServicesA 計算那些具有數學計算的客戶端 id 的行(這相當于計算該資料幀上的 serviceidA
def getTotaldfServicesA(clientid):
total_services = 0
for index, row in df_ServicesA.iterrows():
if row['ClientID'] == clientid:
total_services = 1
return total_services
df['Total_servicesA'] = df.apply(lambda row: getTotaldfServicesA(row['ClientID']),axis=1)
我“相信”公式有效,但我說“我相信”,因為我在技術上還沒有看到生成的 df,因為 df_ServicesA 是一個很長的迭代串列,并且 df_ServicesB 上的客戶端數量也很長,使得迭代程序呈指數級增長lambda 函式已經運行了幾次,但要么失敗且沒有錯誤,要么一夜之間超時,當我到達我的計算機查看結果時,我已經斷開連接。目前它已經運行了 4 個小時,但我仍然沒有得到結果 df 資料集/框架。
也許有一種更pythonic的方法來做到這一點?或者也許是一種提高效率的方法,這樣它就不會永遠持續下去?
先感謝您
uj5u.com熱心網友回復:
您可以對第一個資料框進行分組并計算組數:
# Assuming that df:ServicesA is df_a
grouped = df_a.groupby("clientID").count()
>>> grouped
ServiceID_A
clientID
A 1
B 2
C 1
之后,您可以將外部連接到與merge函式分組的第二個資料框:
# Assuming that df:ServicesB is df_b
joined = df_b[["ClientID"]].merge(grouped, left_on="ClientID",
right_on="clientID", how="left").fillna(0)
>>> joined
clientID ServiceID_A
0 A 1.0
1 B 2.0
2 D 0.0
uj5u.com熱心網友回復:
給你:我用 csv 檔案測驗了你的 dateframe,它的作業原理:
sA = pd.read_csv("ServicesA.csv")
sB = pd.read_csv("ServicesB.csv")
count_dict = sA.groupby(['ClientID']).size().to_dict()
count_dict.setdefault('D',0)
sB['count(ServiceID_A)'] = sB.ClientID.replace(count_dict)
如果這不起作用,請告訴我
uj5u.com熱心網友回復:
您應該始終避免迭代 DataFrame/Series,它非常慢。它應該是你最后的資源。幾乎總是有更好的方法。在這種情況下,您要查看groupby和merge。你應該閱讀這些指南
- https://pandas.pydata.org/docs/user_guide/groupby.html
- https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html
這將比使用快得多 iterrows
>>> res = (
df_ServicesB.merge(df_ServicesA, how='left', on='ClientID')
.groupby('ClientID', as_index=False)
[['ServiceID_A']].count()
)
>>> res.columns = ["ClientID With ServiceID_B", "count(ServiceID_A)"]
>>> res
ClientID With ServiceID_B count(ServiceID_A)
0 A 1
1 B 2
2 D 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/340525.html
下一篇:冒號和空格后的熊貓正則運算式大寫
