【问题标题】:Rename pandas entries within if-loop在 if-loop 中重命名 pandas 条目
【发布时间】:2020-04-20 11:48:57
【问题描述】:

我得到了一个看起来像这样的数据框:

 appended_data
...
...
Out[24]: 
         Unnamed: 0  Region     GeneID  DistanceValue
229676       229676     8.0   69013161       0.972237
229677       229677     8.0   75931496       0.978386
229678       229678     8.0   73424023       0.982667
229679       229679     8.0   74736195       0.987057
280716       280716    10.0   69782778       0.971998
            ...     ...        ...            ...
1097355     1097355    42.0     633685       0.972917
1097356     1097356    42.0   68301216       0.974058
1097357     1097357    42.0  100146162       0.977017
1097358     1097358    42.0   74734794       0.985398
1097359     1097359    42.0     633694       0.992054

[136 rows x 4 columns]

我想在 if 循环中重命名 Region 中的条目:

Like.. region 42 应该成为 layernames 的 42. entry 的名称。我试过了:

import pandas as pd
appended_data = pd.read_csv('/home/anja/0415_pyversion.csv')
with open('/home/anja/Schreibtisch/Master/ABA/layer2_names.txt') as f:
    layernames = [line.strip() for line in f.read().split('\n')]


for i in range(43):
    if (appended_data.Region == i).all:
     (appended_data.Region == i).all = layernames[i] 

我试过了,我没有收到错误消息,但我的条目没有被重命名。

.. 如果这样做

print((appended_data.Region == i).all)

我明白了:

Name: Region, Length: 136, dtype: bool>
<bound method Series.all of 229676     False
229677     False
229678     False
229679     False
280716     False

1097355     True
1097356     True
1097357     True
1097358     True
1097359     True
Name: Region, Length: 136, dtype: bool>

【问题讨论】:

  • 在循环之前添加print((appended_data.Region == i).all)之前。你得到什么输出?
  • @ForceBru 我在上面加了
  • 见:&lt;bound method Series.all of ...。这是一个方法,但你没有调用它,所以它什么都不做
  • 你能打印 layernames 的输出吗?
  • 它只是一个包含 43 个字符串的列表,例如 ['background', 'bla', ..] 我也只有 43 个不同的区域..

标签: python pandas


【解决方案1】:

Series.map

如果您曾经使用 for i in range(..) 作为迭代器,那么警报应该响起,因为 Python 作为内置迭代器可以通过 enumerate 访问

您没有给出层名称是什么的最小示例,但它似乎是一个列表。

我们可以利用 map 函数和字典并进行一次性操作来替换所有区域名称。s

设置

import pandas as pd

s = ['a','b','c'] # your layer_name list. 

layer_dict = {k : v for (k,v) in enumerate(s)}
# {0: 'a', 1: 'b', 2: 'c'}
df = pd.DataFrame([0,1,2],columns=list('A'))

在行动中:

df['B'] = df['A'].map(layer_dict)
print(df)
   A  B
0  0  a
1  1  b
2  2  c

【讨论】:

    猜你喜欢
    • 2018-01-14
    • 2015-11-26
    • 2014-08-28
    • 2020-05-10
    • 2018-10-27
    • 2013-10-31
    • 2018-11-01
    • 2021-04-24
    • 2020-04-24
    相关资源
    最近更新 更多