Python 在不产生链索引的情况下处理数据帧中的行(不仅仅是索引)

Python 在不产生链索引的情况下处理数据帧中的行(不仅仅是索引),python,pandas,indexing,dataframe,series,Python,Pandas,Indexing,Dataframe,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']) 看起来像这样(只是大得多):

我的数据组织在一个数据框架中:

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'])
看起来像这样(只是大得多):

我的算法在这个表行中循环并执行一组操作

为了干净/懒散,我希望在每次迭代中只处理一行,而不必键入
df.loc['row index','column name']
来获取每个单元格的值

我已尝试使用以下方法进行操作,例如:

row_of_interest = df.loc['R2', :]
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
但是,当我这样做时,仍然会收到警告:

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:

使用提供的回复,警告将从代码中删除,但原始数据帧不会被修改:“感兴趣的行”
系列
是一个副本,而不是原始数据帧的一部分。例如:

row_of_interest = df.loc['R2', :]
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:

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
这是我想要复制的功能的一个例子。在python中,列表列表的列表如下所示:

a = [[1,2,3],[4,5,6]]
现在我可以创建一个“标签”

如果我更改了b中的条目:

b[0] = 7
a和b都变了

print a, b

[[7,2,3],[4,5,6]], [7,2,3]
此行为是否可以在熊猫数据帧之间复制,该数据帧将其中一行标记为熊猫系列?

这应该可以:

row_of_interest = df.loc['R2', :]
row_of_interest.is_copy = False
row_of_interest['Col2'] = row_of_interest['Col2'] + 1000
设置
.is\u 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:

这应该起作用:

row_of_interest = df.loc['R2', :]
row_of_interest.is_copy = False
row_of_interest['Col2'] = row_of_interest['Col2'] + 1000
设置
.is\u 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:


这是最直接的方法

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

这是最直接的方法

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

您可以通过创建一个包含要处理的切片的系列来删除警告:

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

通过使用要处理的切片创建系列,可以删除警告:

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

非常感谢您的回复。事实上,我现在没有得到警告。但是,感兴趣的行仍然是一个副本(我添加了一个示例)。您认为我应该在代码末尾替换数据框中的新行序列吗?非常感谢您的回复。事实上,我现在没有得到警告。但是,感兴趣的行仍然是一个副本(我添加了一个示例)。您认为我应该在代码末尾替换数据框中的新行序列吗?非常感谢您的回复。抱歉,我不够清楚:在这个例子中,我只想修改“感兴趣的行”pandas系列中的一个单元格值,该值也会反映在“df”pandas数据框中。再次感谢!这确实是它必须采取的行动。但是,该问题的目的是避免在您只关注一行的情况下键入“.loc[Row_of_interest”。我在Edit2中添加了一个示例以更好地说明此问题。再次感谢。非常感谢您的答复。抱歉,我不够清楚:在该示例中,我只想修改“row_of_interest”pandas系列,也将反映在“df”pandas数据框架上。再次感谢!这确实是它必须工作的方式。但是,问题的目的是避免键入“.loc[row_of_interest”"如果您只关注一行,我在Edit2中添加了一个示例来更好地说明这个问题。再次感谢。非常感谢您的回复。您的解决方案确实避免了警告。但是,当我修改感兴趣的行时,原始数据框保持不变。您将如何做?您是否只替换旧的行代码末尾有新的一行吗?非常感谢您的回复。您的解决方案确实避免了警告。但是,当我修改感兴趣的行时,原始数据帧保持不变。您将如何做?您是否将代码末尾的新行替换为旧行?查看我编辑的答案查看我编辑的答案回答