Python 如何更新列值及其';s基于列的值的相应索引?

Python 如何更新列值及其';s基于列的值的相应索引?,python,pandas,if-statement,for-loop,dataframe,Python,Pandas,If Statement,For Loop,Dataframe,在以下结构的数据框中: mcve_data = alfa alfa_id beta beta_id a,c 7 c,de 8 c,d 7 d,f 9 l,mnk 8 c,d 9 j,k 8 d,e 9 tk,l 8 n,k 11 我想在每行中运行一个for循环,读取key(alfa和beta)和key\u ind

在以下结构的数据框中:

mcve_data =

alfa   alfa_id     beta    beta_id
a,c    7           c,de    8
c,d    7           d,f     9
l,mnk  8           c,d     9
j,k    8           d,e     9
tk,l   8           n,k     11
  • 我想在每行中运行一个for循环,读取
    key
    (alfa和beta)和
    key\u index
    (alfa\u index,beta\u index)中的值
  • 如果
    键中的值长度超过
    3
    ,或者如果任何值的长度超过1个字符。我希望
    键值
    键索引
    都转换为句点
最终预期产出

alfa   alfa_id     beta    beta_id
a,c    7           .      .
c,d    7           d,f     9
.      .           c,d     9
j,k    8           d,e     9
.      .           n,k     11
我想写一个函数,比如(但它没有正常工作):


任何建议,

都可以用于循环和iterrows()。见下文

import pandas as pd
from StringIO import StringIO

s = """alfa   alfa_id     beta    beta_id
a,c    7           c,de    8
c,d    7           d,f     9
l,mnk  8           c,d     9
j,k    8           d,e     9
tk,l   8          n,k     11
"""

df = pd.read_table(StringIO(s), delim_whitespace = True,  dtype ={'alfa': str, 'alfa_id': str,
                                                                 'beta': str, 'beta_id': str})

# I create a lsit of keys and key index based on '_id' distinction

keys = [i for i in df.columns if 'id' not in i]
key_ids = [i+'_id' for i in keys]

for index, row in df.iterrows():
    for k,kid in zip(keys, key_ids):
        if (len(row[k].split(','))>3 or any([len(i) > 1 for i in row[k].split(',')])):
            df.set_value(index, kid, '.')
            df.set_value(index, k, '.')


print df
导致

  alfa alfa_id beta beta_id
0  a,c       7    .       .
1  c,d       7  d,f       9
2    .       .  c,d       9
3  j,k       8  d,e       9
4    .       .  n,k      11

您还可以使用
str
访问器立即检查列中每个值的长度,从而跳过内部for循环:

keys = [k for k in df.columns if not k.endswith('_id')]
for k in keys:
    df.loc[df[k].str.len()>3,[k,k+'_id']] = '.'

谢谢你的回答。但是,我想申请循环,原因是-有很多(大约100秒)的
键和key_id
,而不仅仅是2。我用第二个for循环编辑了代码。对于所有的密钥和密钥ID,感谢更新。那些
int
值被转换成
字符串的原因是什么,比如
'11'
。我将尝试找到解决方案,但如果您可以不费吹灰之力地完成,我将不胜感激。pandas read_table将数据读取为int,因此我将文本数据更改为字符串。但现在应该没事了。
keys = [k for k in df.columns if not k.endswith('_id')]
for k in keys:
    df.loc[df[k].str.len()>3,[k,k+'_id']] = '.'