我创建了一个包含一个字符串列的熊猫DataFrame。我想将它的一些行复制到第二个DataFrame中:只是第一个空格之前的字符是大于或等于300个整数的行,第一个空格后面的字符是“百老汇”。在下面的示例中,只应复制第一行。
我更愿意解决这个问题,而不是简单地用直接的Python编写布尔表达式。让我们假设我想让某人相信使用熊猫而不是没有熊猫的Python的好处。非常感谢。
d = {
"address": [
"300 Broadway", #Ok.
"300 Wall Street", #Sorry, not "Broadway".
"100-10 Broadway", #Sorry, "100-10" is not an integer.
"299 Broadway", #Sorry, 299 is less than 300.
"Broadway" #Sorry, no space at all.
]
}
df = pd.DataFrame(d)
df2 = df[what goes here?] #Broadway addresses greater than or equal to 300
print(df2)发布于 2019-10-13 22:52:53
我认为最好先清理一下数据,例如:
# prepare data
df[['number', 'street']] = df.address.str.split('\s+', n=1, expand=True)
df['number'] = pd.to_numeric(df.number, errors='coerce')第一行将地址拆分为数字和街道,第二行将数字转换为实际整数,注意那些不是整数的值将被转换为NaN。然后你就可以:
# create mask to filter
mask = df.number.ge(300) & df.street.str.contains("Broadway")
print(df[mask])基本上,创建一个布尔掩码,其中的数字大于或等于300,街道是百老汇。综合起来,你有:
# prepare data
df[['number', 'street']] = df.address.str.split('\s+', n=1, expand=True)
df['number'] = pd.to_numeric(df.number, errors='coerce')
# create mask to filter
mask = df.number.eq(300) & df.street.str.contains("Broadway")
print(df[mask])输出
address number street
0 300 Broadway 300.0 Broadway请注意,此解决方案假定您的数据具有模式:Number Street。
发布于 2019-10-13 23:07:56
您可以使用str.contains、str.extract和ge
# rows which contain broadway
m1 = df['address'].str.contains('(?i)broadway')
# extract the numbers from the string and check if they are greater of equal to 300
m2 = df['address'].str.extract('(\d+)')[0].astype(float).ge(300)
# get all the rows which have True for both conditions
df[m1&m2]输出
address
0 300 Broadwayhttps://stackoverflow.com/questions/58368319
复制相似问题