在一个数据帧大熊猫一排,而不会产生链索引工作(不只是应对索引)(Work with a row in

2019-09-28 03:03发布

我的数据组织在一个数据帧:

import pandas as pd
import numpy as np

data = {'Col1' : [4,5,6,7], 'Col2' : [10,20,30,40], 'Col3' : [100,50,-30,-50], 'Col4' : ['AAA', 'BBB', 'AAA', 'CCC']}

df = pd.DataFrame(data=data, index = ['R1','R2','R3','R4'])

它看起来像这样(只大得多):

    Col1  Col2  Col3 Col4
R1     4    10   100  AAA
R2     5    20    50  BBB
R3     6    30   -30  AAA
R4     7    40   -50  CCC

我的算法遍历这个表中的行,并执行一组操作。

对于清洁度/ lazyness起见,我想在每次迭代的单排工作,而无需键入df.loc['row index', 'column name']以获取每个单元格的值

我曾试图按照正确的样式使用,例如:

row_of_interest = df.loc['R2', :]

但是,我还是得到警告,当我做:

row_of_interest['Col2'] = row_of_interest['Col2'] + 1000

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

而且它不工作(如我意),它正在复制

print df

    Col1  Col2  Col3 Col4
R1     4    10   100  AAA
R2     5    20    50  BBB
R3     6    30   -30  AAA
R4     7    40   -50  CCC

用正确的方法有什么建议做呢? 或者我应该只是坚持直接与数据帧的工作?

编辑1:

使用提供的警告从代码中删除,但原来的数据帧不被修改的答复:在“利益排” Series是一个副本而不是原始数据帧的一部分。 例如:

import pandas as pd
import numpy as np

data = {'Col1' : [4,5,6,7], 'Col2' : [10,20,30,40], 'Col3' : [100,50,-30,-50], 'Col4' : ['AAA', 'BBB', 'AAA', 'CCC']}

df = pd.DataFrame(data=data, index = ['R1','R2','R3','R4'])

row_of_interest         = df.loc['R2']
row_of_interest.is_copy = False
new_cell_value          = row_of_interest['Col2'] + 1000
row_of_interest['Col2'] = new_cell_value

print row_of_interest 

Col1       5
Col2    1020
Col3      50
Col4     BBB
Name: R2, dtype: object

print df

    Col1  Col2  Col3 Col4
R1     4    10   100  AAA
R2     5    20    50  BBB
R3     6    30   -30  AAA
R4     7    40   -50  CCC

编辑2:

这是我想复制功能的示例。 在Python列表清单是这样的:

a = [[1,2,3],[4,5,6]]

现在,我可以创造一个“标签”

b = a[0]

如果我改变b条目:

b[0] = 7

A和B的变化。

print a, b

[[7,2,3],[4,5,6]], [7,2,3]

可这种行为是大熊猫据帧标记其行之一的熊猫系列之间复制吗?

Answer 1:

这应该工作:

row_of_interest = df.loc['R2', :]
row_of_interest.is_copy = False
row_of_interest['Col2'] = row_of_interest['Col2'] + 1000

设置.is_copy = False是绝招

编辑2:

import pandas as pd
import numpy as np

data = {'Col1' : [4,5,6,7], 'Col2' : [10,20,30,40], 'Col3' : [100,50,-30,-50], 'Col4' : ['AAA', 'BBB', 'AAA', 'CCC']}

df = pd.DataFrame(data=data, index = ['R1','R2','R3','R4'])

row_of_interest         = df.loc['R2']
row_of_interest.is_copy = False
new_cell_value          = row_of_interest['Col2'] + 1000
row_of_interest['Col2'] = new_cell_value

print row_of_interest 

df.loc['R2'] = row_of_interest 

print df

DF:

    Col1  Col2  Col3 Col4
R1     4    10   100  AAA
R2     5  1020    50  BBB
R3     6    30   -30  AAA
R4     7    40   -50  CCC


Answer 2:

你可以通过创建你想要的工作片A系列删除警告:

from pandas import Series
row_of_interest = Series(data=df.loc['R2', :])
row_of_interest.loc['Col2'] += 1000
print(row_of_interest)

结果是:

Col1       5
Col2    1020
Col3      50
Col4     BBB
Name: R2, dtype: object


Answer 3:

最直接的方式做到这一点

df.loc['R2', 'Col2'] += 1000
df



文章来源: Work with a row in a pandas dataframe without incurring chain indexing (not coping just indexing)