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循环,读取
(alfa和beta)和key
(alfa\u index,beta\u index)中的值key\u index
- 如果
键中的值长度超过
,或者如果任何值的长度超过1个字符。我希望3
和键值
都转换为句点键索引
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']] = '.'