形成下面的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
答案 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)