[英]Using Merge on a column and Index in Pandas
我有两个单独的数据框,它们共享一个项目编号。 在type_df
,项目编号是索引。 在time_df
,项目编号是一列。 我想计算type_df
中Project Type
为2
的行数。 我正在尝试使用pandas.merge()
来做到这一点。 使用两列时效果很好,但不能使用索引。 我不确定如何引用索引,以及merge
是否是正确的方法。
import pandas as pd
type_df = pd.DataFrame(data = [['Type 1'], ['Type 2']],
columns=['Project Type'],
index=['Project2', 'Project1'])
time_df = pd.DataFrame(data = [['Project1', 13], ['Project1', 12],
['Project2', 41]],
columns=['Project', 'Time'])
merged = pd.merge(time_df,type_df, on=[index,'Project'])
print merged[merged['Project Type'] == 'Type 2']['Project Type'].count()
错误:
名称“索引”未定义。
期望输出:
2
如果要在合并中使用索引,则必须指定left_index=True
或right_index=True
,然后使用left_on
或right_on
。 对你来说,它应该是这样的:
merged = pd.merge(type_df, time_df, left_index=True, right_on='Project')
另一种解决方案是使用DataFrame.join
:
df3 = type_df.join(time_df, on='Project')
对于版本pandas 0.23.0+
的on
、 left_on
和right_on
参数现在可以引用列名或索引级别名称:
left_index = pd.Index(['K0', 'K0', 'K1', 'K2'], name='key1')
left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key2': ['K0', 'K1', 'K0', 'K1']},
index=left_index)
right_index = pd.Index(['K0', 'K1', 'K2', 'K2'], name='key1')
right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3'],
'key2': ['K0', 'K0', 'K0', 'K1']},
index=right_index)
print (left)
A B key2
key1
K0 A0 B0 K0
K0 A1 B1 K1
K1 A2 B2 K0
K2 A3 B3 K1
print (right)
C D key2
key1
K0 C0 D0 K0
K1 C1 D1 K0
K2 C2 D2 K0
K2 C3 D3 K1
df = left.merge(right, on=['key1', 'key2'])
print (df)
A B key2 C D
key1
K0 A0 B0 K0 C0 D0
K1 A2 B2 K0 C1 D1
K2 A3 B3 K1 C3 D3
您必须在每个数据框中具有相同的列才能合并。
在这种情况下,只需为type_df
创建一个“项目”列,然后合并:
type_df['Project'] = type_df.index.values
merged = pd.merge(time_df,type_df, on='Project', how='inner')
merged
# Project Time Project Type
#0 Project1 13 Type 2
#1 Project1 12 Type 2
#2 Project2 41 Type 1
print merged[merged['Project Type'] == 'Type 2']['Project Type'].count()
2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.