我有两个数据帧,names
和claims
:
names = pd.DataFrame({
'UniqueID': 'A B C D E F'.split(),
'Name':['Susie', 'George Foreman', 'Charles', 'Nicole', 'Peter Piper', 'Penelope Cruz'],
'Address':['111 3rd St', '123 Bank St', '555 Square Sq', '9 Charlton Ave', 'PO Box 1', 'The White House'],
'Phone number':['2032218686', '2032032203', '8048048804', '2232645879', '2564544469', '8005865555']})
UniqueID Name Address Phone number
0 A Susie 111 3rd St 2032218686
1 B George Foreman 123 Bank St 2032032203
2 C Charles 555 Square Sq 8048048804
3 D Nicole 9 Charlton Ave 2232645879
4 E Peter Piper PO Box 1 2564544469
5 F Penelope Cruz The White House 8005865555
claims = pd.DataFrame({
'ClaimNo':range(29,38),
'ClaimDetails':['Slip and fall','Clmt slipped and fell','Thunderstorms are scary','Hail storm damage',
'Property fire','Arson','Shooting','Shooting and fatality','Slip and fall'],
'PolicyNo':['00058566-0','00056455-5','00058588-8','00011111-2','00088787-0','00045658-0','00012345-6','00065432-1','00088080-4'],
'UniqueID':'A F F D E A D E E'.split()})
ClaimNo ClaimDetails PolicyNo UniqueID
0 29 Slip and fall 00058566-0 A
1 30 Clmt slipped and fell 00056455-5 F
2 31 Thunderstorms are scary 00058588-8 F
3 32 Hail storm damage 00011111-2 D
4 33 Property fire 00088787-0 E
5 34 Arson 00045658-0 A
6 35 Shooting 00012345-6 D
7 36 Shooting and fatality 00065432-1 E
8 37 Slip and fall 00088080-4 E
我想创建一个仅包含names
行的新DataFrame,其唯一ID出现在claims
中。我不确定是否应该合并或过滤它们。我一直在尝试不同类型的合并,但似乎无法获得想要的结果,该结果应如下所示:
UniqueID Name Address Phone number
0 A Susie 111 3rd St 2032218686
1 D Nicole 9 Charlton Ave 2232645879
2 E Peter Piper PO Box 1 2564544469
3 F Penelope Cruz The White House 8005865555
答案 0 :(得分:1)
这对我来说似乎是最简单的方法:
names[names.UniqueID.isin(claims['UniqueID'].to_numpy())]
编辑:对于正在回答的其他人,这是我用来回答OP问题的一些帮助字典/数据框变量:
data1 = {"UniqueID": {"0": "A", "1": "B", "2": "C", "3": "D", "4": "E", "5": "F"}, "Name": {"0": "Susie", "1": "George Foreman", "2": "Charles", "3": "Nicole", "4": "Peter Piper", "5": "Penelope Cruz"}, "Address": {"0": "111 3rd St", "1": "123 Bank St", "2": "555 Square Sq", "3": "9 Charlton Ave", "4": "PO Box 1", "5": "The White House"}, "Phone number": {"0": 2032218686, "1": 2032032203, "2": 8048048804, "3": 2232645879, "4": 2564544469, "5": 8005865555}}
names = pd.DataFrame.from_dict(data1)
data2 = {"ClaimNo": {"0": 29, "1": 30, "2": 31, "3": 32, "4": 33, "5": 34, "6": 35, "7": 36, "8": 37}, "ClaimDetails": {"0": "Slip and fall", "1": "Clmt slipped and fell", "2": "Thunderstorms are scary", "3": "Hail storm damage", "4": "Property fire", "5": "Arson", "6": "Shooting", "7": "Shooting and fatality", "8": "Slip and fall"}, "PolicyNo": {"0": "00058566-0", "1": "00056455-5", "2": "00058588-8", "3": "00011111-2", "4": "00088787-0", "5": "00045658-0", "6": "00012345-6", "7": "00065432-1", "8": "00088080-4"}, "UniqueID": {"0": "A", "1": "F", "2": "F", "3": "D", "4": "E", "5": "A", "6": "D", "7": "E", "8": "E"}}
claims = pd.DataFrame.from_dict(data2)
OP:如果您下次提供这些变量,将很有帮助,我必须使用pd.read_fwf将固定宽度格式表读取为字典对象
答案 1 :(得分:0)
这行不通吗?
print (pd.merge(names, claims, on='UniqueID'))
然后,您可以删除不需要的列
data = data.drop(columns="some_column_name")
答案 2 :(得分:0)
您可以使用merge方法。只需确保两个数据框中的UniqueID列具有相同的dtype(在这种情况下,很可能是'str')。
new_df = df1.merge(df2, how='inner' ,on='UniqueID')
如果这不起作用,则如上所述,这是因为您的列具有不同的dtype。它们也可能有多余的空格。为了同时更改这两个功能,您可以执行以下操作:
df1['UniqueID'] = df1['UniqueID'].astype(str).str.replace(" ","")
df2['UniqueID'] = df2['UniqueID'].astype(str).str.replace(" ","")
然后您可以删除不需要的列:
new_df = new_df.drop(columns=['ClaimDetails','PolicyNo'])