根据 pandas 数据框中的其他索引值对索引值进行分组
Group index values based on other index values in pandas Data Frame
我有一个具有以下结构的数据框
Sentence Label
A B
"unique ID1" 0 "Sample sentence 1" jt
"unique ID1" 1 "Sample sentence 2" jt
"unique ID3" 2 "Sample sentence 3" edu
"unique ID3" 3 "Sample sentence 4" edu
我希望能够将索引 B
的所有值按索引 A
的值分组,其中 label == jt
并对所有唯一标签值重复该操作。首选 return 类型是 key-value
对,但任何其他合适的格式也可以。
标签 == jt 的有效示例:
("unique ID1" : [0,1] )
label == edu 的有效示例:
("unique ID3" : [2,3] )
我已经尝试了很多 SO
个问题,但还没有找到我要找的东西。
我也试过这个:
sorted_index_df = df.sort_index(inplace = False)
multi_index = sorted_index_df.loc[sorted_index_df["label"] == "jt"].index
这样做会 return 索引 A
的每个值及其对应的索引 B
的值作为一个单独的元组。
例如:('Labor_&_Delivery_Nurse-APRN__Lidia_Lambert__', 17)
但我希望能够根据索引 A
.
中的值对索引 B
的所有值进行分组
感谢任何帮助。
您可以像下面这样使用 group by 来实现此目的
df = pd.DataFrame([['unique ID1', '0', 'Sample sentence 1', 'jt'], ['unique ID1', '1', 'Sample sentence 2', 'jt'], ['unique ID3', '2', 'Sample sentence 3', 'edu'], ['unique ID3', '3', 'Sample sentence 4', 'edu']], columns=('A', 'B', 'Sentence', 'Label'))
result = df.groupby(["A", "Label"]).agg({"B":list}).reset_index(level=0)
## you can get result for jt like
result.loc["jt"]
试试这个:
只得到'jt'
df[df.Label.eq('jt')].reset_index(level=1).groupby(level=0).B.unique()
Out[22]:
A
unique ID1 [0, 1]
Name: B, dtype: object
只得到'edu'
df[df.Label.eq('edu')].reset_index(level=1).groupby(level=0).B.unique()
Out[23]:
A
unique ID3 [2, 3]
Name: B, dtype: object
为了提供更好的展示效果,我对您的数据样本进行了一些扩展:
Sentence Label
A B
ID1 0 Sample sentence 1 jt
1 Sample sentence 2 jt
ID3 2 Sample sentence 3 edu
3 Sample sentence 4 edu
ID4 4 Sample sentence 5 jt
5 Sample sentence 6 jt
ID5 6 Sample sentence 7 edu
7 Sample sentence 8 edu
目标是每个 Label.
至少有 2 个不同的 ID
要计算所有 Labels 和 IDs 的结果就足够了
运行 一条指令:
df.reset_index().groupby(['Label', 'A']).B.apply(list)
对于我的数据,结果是:
Label A
edu ID3 [2, 3]
ID5 [6, 7]
jt ID1 [0, 1]
ID4 [4, 5]
我有一个具有以下结构的数据框
Sentence Label
A B
"unique ID1" 0 "Sample sentence 1" jt
"unique ID1" 1 "Sample sentence 2" jt
"unique ID3" 2 "Sample sentence 3" edu
"unique ID3" 3 "Sample sentence 4" edu
我希望能够将索引 B
的所有值按索引 A
的值分组,其中 label == jt
并对所有唯一标签值重复该操作。首选 return 类型是 key-value
对,但任何其他合适的格式也可以。
标签 == jt 的有效示例:
("unique ID1" : [0,1] )
label == edu 的有效示例:
("unique ID3" : [2,3] )
我已经尝试了很多 SO
个问题,但还没有找到我要找的东西。
我也试过这个:
sorted_index_df = df.sort_index(inplace = False)
multi_index = sorted_index_df.loc[sorted_index_df["label"] == "jt"].index
这样做会 return 索引 A
的每个值及其对应的索引 B
的值作为一个单独的元组。
例如:('Labor_&_Delivery_Nurse-APRN__Lidia_Lambert__', 17)
但我希望能够根据索引 A
.
B
的所有值进行分组
感谢任何帮助。
您可以像下面这样使用 group by 来实现此目的
df = pd.DataFrame([['unique ID1', '0', 'Sample sentence 1', 'jt'], ['unique ID1', '1', 'Sample sentence 2', 'jt'], ['unique ID3', '2', 'Sample sentence 3', 'edu'], ['unique ID3', '3', 'Sample sentence 4', 'edu']], columns=('A', 'B', 'Sentence', 'Label'))
result = df.groupby(["A", "Label"]).agg({"B":list}).reset_index(level=0)
## you can get result for jt like
result.loc["jt"]
试试这个:
只得到'jt'
df[df.Label.eq('jt')].reset_index(level=1).groupby(level=0).B.unique()
Out[22]:
A
unique ID1 [0, 1]
Name: B, dtype: object
只得到'edu'
df[df.Label.eq('edu')].reset_index(level=1).groupby(level=0).B.unique()
Out[23]:
A
unique ID3 [2, 3]
Name: B, dtype: object
为了提供更好的展示效果,我对您的数据样本进行了一些扩展:
Sentence Label
A B
ID1 0 Sample sentence 1 jt
1 Sample sentence 2 jt
ID3 2 Sample sentence 3 edu
3 Sample sentence 4 edu
ID4 4 Sample sentence 5 jt
5 Sample sentence 6 jt
ID5 6 Sample sentence 7 edu
7 Sample sentence 8 edu
目标是每个 Label.
至少有 2 个不同的 ID要计算所有 Labels 和 IDs 的结果就足够了 运行 一条指令:
df.reset_index().groupby(['Label', 'A']).B.apply(list)
对于我的数据,结果是:
Label A
edu ID3 [2, 3]
ID5 [6, 7]
jt ID1 [0, 1]
ID4 [4, 5]