首页 文章

无法执行Python Pandas set_value

提问于
浏览
5

在Python 3.5中遇到了Pandas的问题

我使用Pandas读取本地csv,csv包含纯数据,不涉及头文件 . 然后我使用了分配列名

df= pd.read_csv(filePath, header=None)
df.columns=['XXX', 'XXX'] #for short, totally 11 cols

csv有11列,其中一列是字符串,其他是整数 .

然后我尝试在一个循环中逐个单元格地用整数值替换字符串列

for i, row in df.iterrows():
    print(i, row['Name'])
    df.set_value(i, 'Name', 123)

intrger 123就是一个例子,并非这个列下的每个单元格都是123.如果我删除set_value,print函数效果很好,但是

df.set_value(i, 'Name', 123)

然后错误信息:

回溯(最近一次调用最后一次):文件“D:/xxx/test.py”,第20行,在df.set_value(i,'Name',233)文件“E:\ Users \ XXX \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py“,第1862行,在set_value series = self._get_item_cache(col)文件”E:\ Users \ XXX \ Anaconda3 \ lib \ site-packages \ pandas \ core \ generic.py “,第1351行,_get_item_cache res = self._box_item_values(item,values)文件”E:\ Users \ XXX \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py“,第2334行,在_box_item_values中返回self ._constructor(values.T,columns = items,index = self.index)AttributeError:'BlockManager'对象没有属性'T'

但是,如果我在代码中手动创建一个数据帧

df = pd.DataFrame(index=[0, 1, 2], columns=['x', 'y'])
df['x'] = 2
df['y'] = 'BBB'
print(df)
for i, row in df.iterrows():
    df.set_value(i, 'y', 233)


print('\n')
print(df)

有效 . 我想知道可能有些东西我不见了?

谢谢!

2 回答

  • 0

    原始错误的原因:

    Pandas DataFrame set_value(index,col,value)方法将返回发布的obscure AttributeError:当被修改的数据帧具有重复的列名时,'BlockManager'对象没有属性'T' .

    可以使用@Windtalker上面的代码重现该错误,其中唯一的变化是列名称现在都是'x'而不是'x'和'y' .

    import pandas as pd
    df = pd.DataFrame(index=[0, 1, 2], columns=['x', 'x'])
    df['x'] = 2
    df['y'] = 'BBB'
    print(df)
    for i, row in df.iterrows():
        df.set_value(i, 'y', 233)
    
    print('\n')
    print(df)
    

    希望这有助于其他人诊断同样的问题 .

  • 15

    好吧,现在当你把它弄得更清楚时,回答你的问题会更容易......

    假设您的DF看起来像这样:

    In [164]: df
    Out[164]:
        a   b   c   d   e          city
    0   6  55   3  48  11          Kiev
    1   5  29  42  95  69        Munich
    2  53  79  60  80  89        Berlin
    3   6  70  87   6  85      New York
    4  97  23  94  43  31         Paris
    5  15  17  56  34  77  Zaporizhzhia
    6  28  35  58  82  33        Warsaw
    7  41  93  60  54  21      Hurghada
    8  68  23  80  39  66          Bern
    9  15  17  30  26  98          Lviv
    

    并且你有另一个带有city-id的DF:

    In [165]: cities
    Out[165]:
                  id
    city
    Warsaw         6
    Kiev           0
    New York       3
    Hurghada       7
    Munich         1
    Paris          4
    Berlin         2
    Zaporizhzhia   5
    Lviv           9
    Bern           8
    

    你可以像这样将city映射到city-id:

    In [168]: df['city_id'] = df['city'].map(cities['id'])
    
    In [169]: df
    Out[169]:
        a   b   c   d   e          city  city_id
    0   6  55   3  48  11          Kiev        0
    1   5  29  42  95  69        Munich        1
    2  53  79  60  80  89        Berlin        2
    3   6  70  87   6  85      New York        3
    4  97  23  94  43  31         Paris        4
    5  15  17  56  34  77  Zaporizhzhia        5
    6  28  35  58  82  33        Warsaw        6
    7  41  93  60  54  21      Hurghada        7
    8  68  23  80  39  66          Bern        8
    9  15  17  30  26  98          Lviv        9
    

    PS在使用95%的Pandas时,你并不需要循环使用DF来实现目标

相关问题