将函数应用于 DataFrame GroupBy 对象并返回 DataFrame

2024-09-24 22:27:06 发布

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

如何使用Pandas从groupby对象返回数据帧?这里的目的是读入CSV并用randIP()返回的值替换IP address列中的每个IP地址。我想通过分组来保持整个混淆数据帧的一致性(每个真正的IP映射到一个新的随机IP)。在

我试过很多方法,但这似乎是最成功的。自身.df2正在打印为熊猫。核心。格劳比.SeriesGroupBy对象。在

def __init__(self, filename):
    self.df = pd.read_csv(filename)
    self.grouped = self.df.groupby('IP Address')
    self.df.reset_index(drop=True, inplace=True)
    for i, k in self.grouped:
        r = randIP()
        k['IP Address'] = k['IP Address'].apply(lambda x: x.replace(x, r))
    self.df2 = self.grouped
    print(self.df2['IP Address'])

Tags: csv数据对象self目的iptruepandas
1条回答
网友
1楼 · 发布于 2024-09-24 22:27:06

最好不要尝试从分组操作内部修改数据帧。相反,使用分组操作来创建新的ip,然后使用map将旧IP映射到新IP,然后(如果需要)将新IP分配回数据帧:

def randomIP():
    return ".".join(str(np.random.randint(0, 255) for it in xrange(4)))

>>> d = pandas.DataFrame({'IP': ['1.2.3.4', '5.6.7.8', '1.2.3.4', '5.6.7.8', '9.10.11.12', '13.14.15.16'], 'Other': ['blah']*6})
>>> d
            IP Other
0      1.2.3.4  blah
1      5.6.7.8  blah
2      1.2.3.4  blah
3      5.6.7.8  blah
4   9.10.11.12  blah
5  13.14.15.16  blah

groupbyapply一起使用将给您一个从旧IP到新IP的系列映射:

^{pr2}$

在旧IP列上使用map并传递这个新系列将把旧IP映射到新IP:

>>> d.IP.map(d.groupby('IP').apply(lambda g: randomIP()))
0    47.227.125.190
1      164.86.98.48
2    47.227.125.190
3      164.86.98.48
4     44.150.90.127
5     71.111.59.115
Name: IP, dtype: object

如果要将它们重新分配回DataFrame列,可以执行以下操作:

>>> d['IP'] = d.IP.map(d.groupby('IP').apply(lambda g: randomIP()))
>>> d
               IP Other
0  238.227.204.61  blah
1   13.201.160.89  blah
2  238.227.204.61  blah
3   13.201.160.89  blah
4    69.33.243.79  blah
5  164.120.13.218  blah

我认为最后一个是你想要的一个综合解决方案。(在这些示例中,随机IP每次都是不同的,因为我在示例的每个部分都会再次调用randomIP

相关问题 更多 >