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中添加了一个示例来更好地说明这个问题。再次感谢。非常感谢您的回复。您的解决方案确实避免了警告。但是,当我修改感兴趣的行时,原始数据框保持不变。您将如何做?您是否只替换旧的行代码末尾有新的一行吗?非常感谢您的回复。您的解决方案确实避免了警告。但是,当我修改感兴趣的行时,原始数据帧保持不变。您将如何做?您是否将代码末尾的新行替换为旧行?查看我编辑的答案查看我编辑的答案回答