这只是我编造的一个样本,原始数据集超过600万行,而且是不同的语言。

我需要找到所有 "地址 "和 "原始数据 "不匹配的数据,这意味着在将数据从 "地址 "登录到 "原始数据 "时出现了某种错误。

我对Pandas相当陌生。我的计划是用逗号分开'raw_data'列,然后将新产生的列与原来的'地址'列进行比较(看'地址'列是否有这些信息,如果没有,那就意味着有错误?)

就像我说的,我是大熊猫的新手,这是我目前拥有的东西。

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)

现在,新列的信息是这样的。"city": "atlanta"。我想让这一列只有亚特兰大,而没有所有的冒号和 "城市",以便与 "地址 "列的信息进行比较。 我应该怎么做呢?

另外,在我学习pandas的这个阶段,我还不知道如何比较两列。谁能帮帮我这个新手吗?非常感谢

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

1 个评论
请添加文本格式的样本数据。
python
pandas
David Ha
David Ha
发布于 2020-08-17
3 个回答
Anil Kumar Gupta
Anil Kumar Gupta
发布于 2020-08-17
已采纳
0 人赞同
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
    
你可以简单地使用df["col1"] == df["col2"]。这里np.where是不需要的。
当然我们可以使用,如果我们想要更具体的标志,而不是bool(True/False),那么np.where()会对我们有更大的帮助。
Ricardo Rendich
Ricardo Rendich
发布于 2020-08-17
0 人赞同

我将使用这些数据。

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"])
    address raw_data
0   foo {'address': 'foo', 'b': 'bar'}
1   bar {'address': 'foo2', 'b': 'bar2'}

我将从raw_data中分离出列(用.value.tolist())在另一个df(df2)。

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

要比较你用。

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

如果你需要在原始df中保存这个,你可以添加一列。

df["result"] = df.address == df2.address
    
gunesevitan
gunesevitan
发布于 2020-08-17
0 人赞同

你可以把它们从,中分离出来,只把它们当作dict。你可以将自定义函数映射到列中,用应用函数。在这种情况下,你要定义一个访问字典中的键并提取值的函数。

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'])