如何使用pandas比较两列?

2024-04-20 06:47:36 发布

您现在位置:Python中文网/ 问答频道 /正文

背景: 我有两列:“地址”和“原始数据”。数据集如下所示: this is just a sample I made up, the original dataset is over 6m rows and in a different language

问题: 我需要找到“地址”和“原始数据”不匹配的所有数据,这意味着在将数据从“地址”登录到“原始数据”时出现了一些错误

我对熊猫还不太熟悉。我的计划是用逗号分隔“原始数据”列,然后将新生成的列与原始“地址”列进行比较(查看“地址”列是否包含这些信息,如果没有,则表示有错误?)

就像我说的,我对熊猫还不熟悉,这就是我目前所拥有的

import pandas as pd
columns = ['address', 'raw_data']
df=pd.read_csv('address.csv', usecols=columns)
df = pd.concat([df['address'], df['raw_data'].str.split(',', expand=True)], axis=1)

现在新的专栏有这样的信息:“城市”:“亚特兰大”。我想把亚特兰大列成没有所有冒号和“城市”的列,以便将信息与“地址”列进行比较。 我该怎么继续呢

另外,在我的熊猫学习经历中,我还不知道如何比较这两个专栏。有人能帮一个新手吗?非常感谢

PS:通过比较两列,我的意思是检查一列是否有第二列中的字符,而不是检查两列是否相等。我只想指出这一点


Tags: columnscsv数据信息dfdata原始数据raw
3条回答

只需将它们视为dict,就可以将它们与,分开。可以使用apply函数将自定义函数映射到列。在本例中,您定义了一个函数,该函数访问字典的键并提取值

df['address_raw'] = df['raw_data'].apply(lambda x: x['address'])
df['city_raw'] = df['raw_data'].apply(lambda x: x['CITY'])
df['addrline2_raw'] = df['raw_data'].apply(lambda x: x['ADDR_LINE_2'])
df['addrline3_raw'] = df['raw_data'].apply(lambda x: x['ADDR_LINE_3'])
df['utmnorthing_raw'] = df['raw_data'].apply(lambda x: x['UTM_NORTHING'])

这些行将在dict中创建每个字段的列,然后您可以比较以下字段:

df['address'] == df['address_raw']

我将使用以下数据:

import numpy as np
import pandas as pd
j = {"address":"foo","b": "bar"}
j2 = {"address":"foo2","b": "bar2"}
values = [["foo", j], ["bar", j2]]
df = pd.DataFrame(data=values, columns=["address", "raw_data"])
df
    address raw_data
0   foo {'address': 'foo', 'b': 'bar'}
1   bar {'address': 'foo2', 'b': 'bar2'}

我将在另一个df(df2)中从原始数据(使用.values.tolist())中分离列:

df2 = pd.DataFrame(df['raw_data'].values.tolist())
df2
    address b
0   foo bar
1   foo2    bar2

要进行比较,请使用:

  df.address == df2.address
0     True
1    False

如果需要将其保存在原始df中,可以添加一列:

df["result"] = df.address == df2.address
df = pd.DataFrame([[2, 2], [3, 6],[1,1]], columns = ["col1", "col2"])
comparison_column = np.where(df["col1"] == df["col2"], True, False)
df["equal"] = comparison_column



col1  col2  equal
 2     2   True
 3     6  False
 1     1   True

相关问题 更多 >