pandas dataframe在列上应用函数创建多列

时间:2018-01-03 21:46:08

标签: python pandas apply

我有下面的pandas df,有几列,其中一列是ip_addresses

    df.head()
           my_id   someother_id  created_at        ip_address     state
308074     309115   2859690   2014-09-26 22:55:20   67.000.000.000  rejected
308757     309798   2859690   2014-09-30 04:16:56   173.000.000.000  approved
309576     310619   2859690   2014-10-02 20:13:12   173.000.000.000  approved
310347     311390   2859690   2014-10-05 04:16:01   173.000.000.000 approved
311784     312827   2859690   2014-10-10 06:38:39   69.000.000.000  approved

对于每个ip_address,我正在尝试返回description, city, country

我在下面编写了一个函数并尝试应用它

from ipwhois import IPWhois


def returnIP(ip) :
    obj = IPWhois(str(ip))
    result = obj.lookup_whois()

    description = result["nets"][len(result["nets"]) - 1 ]["description"]
    city = result["nets"][len(result["nets"]) - 1 ]["city"]
    country = result["nets"][len(result["nets"]) - 1 ]["country"]

    return [description, city, country]

# --- 

suspect['ipwhois'] = suspect['ip_address'].apply(returnIP)

我的问题是这会返回一个列表,我想要三个单独的列。

非常感谢任何帮助。我是Pandas / Python的新手,所以如果有更好的方法来编写函数并使用Pandas会非常有帮助。

2 个答案:

答案 0 :(得分:2)

from ipwhois import IPWhois

def returnIP(ip) :
    obj = IPWhois(str(ip))
    result = obj.lookup_whois()

    description = result["nets"][len(result["nets"]) - 1 ]["description"]
    city = result["nets"][len(result["nets"]) - 1 ]["city"]
    country = result["nets"][len(result["nets"]) - 1 ]["country"]

    return (description, city, country)


suspect['description'], suspect['city'], suspect['country'] = \
suspect['ip_address'].apply(returnIP)

答案 1 :(得分:0)

我能够用另一个stackoverflow解决方案解决它

for n,col in enumerate(cols):
    suspect[col] = suspect['ipwhois'].apply(lambda ipwhois: ipwhois[n])

如果有更优雅的方法来解决这个问题,请分享!