在对应于其他两列的列中划分 2 行及其关系(Python)
Dividing 2 rows in a column that is corresponding to two other columns and their relation(Python)
我有一个数据框如下所示,我想要的是"nom_1"列中的每个元素对其对应的target_1到target_0进行划分。因此,对于 "Circle"
,"target_1"
的 "id"
是 9168,"target_0"
的 "id"
是 28152。我需要 9168/28152 的除法。我可以手动执行此操作,但我需要将其自动化,因为会有更多具有不同唯一值的数据帧。
我需要创建一个如下所示的字典:
{'Circle': 0.3705589911482963, 'Polygon': 0.34775978284076003, 'Square': 0.5312055617001106, 'Star': 0.19850208121615415, 'Trapezoid': 1.5383163853653423}
注意:这些数字并不代表实际结果,只是我想要的格式
到目前为止,这是我的代码:
nom_1 target id
0 Circle 0 28152
1 Circle 1 9168
2 Polygon 0 24741
3 Polygon 1 11402
4 Square 0 32787
5 Square 1 16810
6 Star 0 31645
7 Star 1 14259
8 Trapezoid 0 71833
9 Trapezoid 1 29348
10 Triangle 0 19078
11 Triangle 1 10777
nom_1_dat = train.groupby(["nom_1","target"]).count()[["id"]].reset_index()
print(nom_1_dat)
nom_1_dict = {}
i_list = []
for i,element in enumerate(nom_1_dat["nom_1"]):
i_list.append(i)
for i,element in enumerate(nom_1_dat["nom_1"]):
if (i+1) < max(i_list):
nom_1_dict[element] = (nom_1_dat["id"][i+1])/(nom_1_dat["id"][i])
print(nom_1_dict)
试试这个:
dict={}
values = df['nom_1'].unique() # find the norm_1 unique_values
for value in values: # iterate over values
df_t=df[df['nom_1']==value] # get the value from dataframe
dict[value]=int(df_t[df_t['target']==1]['id'])/int(df_t[df_t['target']==0]['id']) # divide the target_1/target_0
print(dict)
希望对您有所帮助!
给定以下数据框:
df=pd.DataFrame([['Circle', 'Circle', 'Polygon', 'Polygon'], [0, 1, 0, 1], [28152, 9168, 24741, 11402]], ['nom_1', 'target', 'id']).T
nom_1 target id
0 Circle 0 28152
1 Circle 1 9168
2 Polygon 0 24741
3 Polygon 1 11402
试试这个代码,使用 groupby.agg:
df_res = df.groupby('nom_1').agg({'id': lambda row_id: row_id[1]/row_id[0]})
或等效的,使用 groupby.apply:
df_res = df.groupby('nom_1').apply(lambda row: (row[row.target==1]['id'].iloc[0]/row[row.target==0]['id'].iloc[0]))
在这两种情况下给出:
id
nom_1
Circle 0.325661
Polygon 0.460854
如果要将结果转成字典:
dict_res = df_res.to_dict()['id']
# output: {'Circle': 0.3256606990622336, 'Polygon': 0.46085445212400467}
我试过给出的答案。当我在具有高基数的列上尝试它们时,我得到了一个 KeyError。我修改了我以前的代码并得到了想要的结果:
nom_1_dat = train.groupby(["nom_1","target"]).count()[["id"]].reset_index()
print(nom_1_dat)
nom_1_dict = {}
i_list = []
for i,element in enumerate(nom_1_dat["nom_1"]):
i_list.append(i)
for i,element in enumerate(nom_1_dat["nom_1"]):
if element not in nom_1_dict.keys():
nom_1_dict[element] = (nom_1_dat["id"][i+1])/(nom_1_dat["id"][i])
print(nom_1_dict)
#output:
{'Circle': 0.3256606990622336, 'Polygon': 0.46085445212400467, 'Square':
0.5127032055387806, 'Star': 0.45059251066519196, 'Trapezoid': 0.40855874041178847,
'Triangle': 0.5648914980605934}
我有一个数据框如下所示,我想要的是"nom_1"列中的每个元素对其对应的target_1到target_0进行划分。因此,对于 "Circle"
,"target_1"
的 "id"
是 9168,"target_0"
的 "id"
是 28152。我需要 9168/28152 的除法。我可以手动执行此操作,但我需要将其自动化,因为会有更多具有不同唯一值的数据帧。
我需要创建一个如下所示的字典:
{'Circle': 0.3705589911482963, 'Polygon': 0.34775978284076003, 'Square': 0.5312055617001106, 'Star': 0.19850208121615415, 'Trapezoid': 1.5383163853653423}
注意:这些数字并不代表实际结果,只是我想要的格式
到目前为止,这是我的代码:
nom_1 target id
0 Circle 0 28152
1 Circle 1 9168
2 Polygon 0 24741
3 Polygon 1 11402
4 Square 0 32787
5 Square 1 16810
6 Star 0 31645
7 Star 1 14259
8 Trapezoid 0 71833
9 Trapezoid 1 29348
10 Triangle 0 19078
11 Triangle 1 10777
nom_1_dat = train.groupby(["nom_1","target"]).count()[["id"]].reset_index()
print(nom_1_dat)
nom_1_dict = {}
i_list = []
for i,element in enumerate(nom_1_dat["nom_1"]):
i_list.append(i)
for i,element in enumerate(nom_1_dat["nom_1"]):
if (i+1) < max(i_list):
nom_1_dict[element] = (nom_1_dat["id"][i+1])/(nom_1_dat["id"][i])
print(nom_1_dict)
试试这个:
dict={}
values = df['nom_1'].unique() # find the norm_1 unique_values
for value in values: # iterate over values
df_t=df[df['nom_1']==value] # get the value from dataframe
dict[value]=int(df_t[df_t['target']==1]['id'])/int(df_t[df_t['target']==0]['id']) # divide the target_1/target_0
print(dict)
希望对您有所帮助!
给定以下数据框:
df=pd.DataFrame([['Circle', 'Circle', 'Polygon', 'Polygon'], [0, 1, 0, 1], [28152, 9168, 24741, 11402]], ['nom_1', 'target', 'id']).T
nom_1 target id
0 Circle 0 28152
1 Circle 1 9168
2 Polygon 0 24741
3 Polygon 1 11402
试试这个代码,使用 groupby.agg:
df_res = df.groupby('nom_1').agg({'id': lambda row_id: row_id[1]/row_id[0]})
或等效的,使用 groupby.apply:
df_res = df.groupby('nom_1').apply(lambda row: (row[row.target==1]['id'].iloc[0]/row[row.target==0]['id'].iloc[0]))
在这两种情况下给出:
id
nom_1
Circle 0.325661
Polygon 0.460854
如果要将结果转成字典:
dict_res = df_res.to_dict()['id']
# output: {'Circle': 0.3256606990622336, 'Polygon': 0.46085445212400467}
我试过给出的答案。当我在具有高基数的列上尝试它们时,我得到了一个 KeyError。我修改了我以前的代码并得到了想要的结果:
nom_1_dat = train.groupby(["nom_1","target"]).count()[["id"]].reset_index()
print(nom_1_dat)
nom_1_dict = {}
i_list = []
for i,element in enumerate(nom_1_dat["nom_1"]):
i_list.append(i)
for i,element in enumerate(nom_1_dat["nom_1"]):
if element not in nom_1_dict.keys():
nom_1_dict[element] = (nom_1_dat["id"][i+1])/(nom_1_dat["id"][i])
print(nom_1_dict)
#output:
{'Circle': 0.3256606990622336, 'Polygon': 0.46085445212400467, 'Square':
0.5127032055387806, 'Star': 0.45059251066519196, 'Trapezoid': 0.40855874041178847,
'Triangle': 0.5648914980605934}