如何替换pandas数据帧中的单元格

时间:2017-10-31 11:58:49

标签: python-3.x pandas

形成下面的python pandas数据帧(例如)

import pandas

data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pandas.DataFrame(data,columns=['Name','Age'])

如果我遍历它,我会得到

In [62]: for i in df.itertuples():
    ...:     print( i.Index, i.Name, i.Age )
    ...:     
0 Alex 10
1 Bob 12
2 Clarke 13

我想要实现的是替换特定单元格的值

In [67]: for i in df.itertuples():
    ...:     if i.Name == "Alex": 
    ...:         df.at[i.Index, 'Age'] = 100 
    ...:         

这似乎有用

In [64]: df
Out[64]: 
     Name  Age
0    Alex  100
1     Bob  12
2  Clarke  13

问题在于,当使用更大的不同数据集时,请执行以下操作:

首先,我创建一个名为 NETELEMENT 的新列,其默认值为"" 我想用函数""返回的字符串

替换默认值lookup_netelement
df['NETELEMENT']    = ""
for i in df.itertuples():
            df.at[i.Index, 'NETELEMENT'] = lookup_netelement(i.PEER_SRC_IP)
            print( i, lookup_netelement(i.PEER_SRC_IP) )

但我得到的结果是:

Pandas(Index=769, SRC_AS='', DST_AS='', COMMS='', SRC_COMMS=nan, AS_PATH='', SRC_AS_PATH=nan, PREF='', SRC_PREF='0', MED='0', SRC_MED='0', PEER_SRC_AS='0', PEER_DST_AS='', PEER_SRC_IP='x.x.x.x', PEER_DST_IP='', IN_IFACE='', OUT_IFACE='', PROTOCOL='udp', TOS='0', BPS=35200.0, SRC_PREFIX='', DST_PREFIX='', NETELEMENT='', IN_IFNAME='', OUT_IFNAME='') routerX

意思是它应该是: NETELEMENT='routerX'代替NETELEMENT=''

你能告诉我我做错了吗?

编辑:出于完整性原因,lookup_netelement被定义为

def lookup_netelement(ipaddr):
    try:
        x = LOOKUP['conn'].hget('ipaddr;{}'.format(ipaddr), 'dev') or b""
    except:
        logger.error('looking up `ipaddr` for netelement caused `{}`'.format(repr(e)), exc_info=True)
        x = b""
    x = x.decode("utf-8")
    return x

1 个答案:

答案 0 :(得分:3)

希望您正在寻找条件替换的位置,即

def wow(x):    
    return x ** 10

df['new'] = df['Age'].where(~(df['Name'] == 'Alex'),wow(df['Age']))

输出:

      Name  Age           new
0    Alex   10   10000000000
1     Bob   12            12
2  Clarke   13            13
3    Alex   15  576650390625

根据您的编辑尝试应用该功能,即

df['new'] = df['PEER_SRC_IP'].apply(lookup_netelement)

编辑:有关发送两列的注释,请使用带轴1的lambda,即

def wow(x,y):    
    return '{} {}'.format(x,y)

df.apply(lambda x : wow(x['Name'],x['Age']),1)