Pandas“试图在数据帧切片的副本上设置值”

2024-03-28 15:06:07 发布

您现在位置:Python中文网/ 问答频道 /正文

理解文档有点困难

请参阅文档中的注意事项:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy dfbride['x']=dfbride.apply(testbride,axis=1) C:/Users/erasmuss/PycharmProjects/Sarah/farmdata.py:38:SettingWithCopyWarning: 试图在数据帧切片的副本上设置值。 尝试改用.loc[row\u indexer,col\u indexer]=value

代码基本上是重新排列和清理一些数据,以使分析更容易。 按每只动物在给定行中编码,但有重复、空格和其他一些稀疏值 这个想法基本上是将行堆叠成列,并获取每只动物的有用数据(按日期和最终体重)

Initial DF 数据帧的几个片段

Output Format 输出DF/csv

import pandas as pd
import numpy as np

#Function for cleaning up multiple entries of breeds
def testbreed(x):
    if x.first_valid_index() is None:
        return None
    else:
        return x[x.first_valid_index()]

#Read Data
df1 = pd.read_csv("farmdata.csv")

#Drop empty rows
df1.dropna(how='all', axis=1, inplace=True)

#Copy to extract Weights in DF2
df2 = df1.copy()
df2 = df2.drop(['BCS', 'Breed','Age'], axis=1)

#Pivot for ID names in DF1
df1 = df1.pivot(index='ID', columns='Date', values=['Breed','Weight', 'BCS'])

#Pivot for weights in DF2
df2 = df2.pivot(index='ID', columns='Date', values = 'Weight')

#Split out Breeds and BCS into individual dataframes w/Duplicate/missing data for each ID
df3 = df1.copy()
dfbreed = df3[['Breed']]
dfBCS = df3[['BCS']]

#Drop empty BCS columns
df1.dropna(how='all', axis=1, inplace=True)

#Shorten Breed and BCS to single Column by grabbing first value that is real. see function above
dfbreed['x'] = dfbreed.apply(testbreed, axis=1)
dfBCS['x'] = dfBCS.apply(testbreed, axis=1)

#Populate BCS and Breed into new DF
df5= pd.DataFrame(data=None)
df5['Breed'] = dfbreed['x']
df5['BCS'] = dfBCS['x']

#Join Weights
df5 = df5.join(df2)

#Write output
df5.to_csv(r'.\out1.csv')

我想获取BCS和繁殖数据帧,这些数据帧在列上按繁殖或BCS多索引,然后按日期多索引,以获取日期行中的第一个非NaN值,并将其设置到名为繁殖的列中

我很难让列在DF上原位选择第一个唯一值 我找到了一个2015年的答案:

2015 Answer

它在顶部定义了函数。 通过设置切片副本上的值可以直观地理解, 但我似乎想不出一种方法可以让它直接替换或基于索引

我应该循环通过吗

The second answer here开始尝试 我明白了

dfbreed.loc[:,'Breed'] = dfbreed['Breed'].apply(testbreed, axis=1)
dfBCS.loc[:, 'BCS'] = dfBCS.apply['BCS'](testbreed, axis=1)

返回

ValueError:使用iterable设置时,必须具有相等的len键和值

我想这和多重索引有关 关键点如下:

多重指数([(‘品种’、‘1/28/2021’), (“品种”,“2/12/2021”), (‘品种’、‘2021年2月4日’), (“品种”,“3/18/2021”), (“品种”,“2021年7月30日”), 名称=[无,'日期']) 多索引([('BCS',1/28/2021'), ('BCS','2021年12月2日'), ('BCS','2021年2月4日'), ('BCS','3/18/2021'), ('BCS','2021年7月30日')], 名称=[无,'日期'])

很抱歉问了这么长的问题 有人能帮我吗

谢谢


Tags: csv数据dffordf1applydf2axis
1条回答
网友
1楼 · 发布于 2024-03-28 15:06:07

您将dfbreed创建为:

dfbreed = df3[['Breed']]

因此,它是原始数据帧的视图(仅限于这一列)

请记住,视图没有自己的数据缓冲区,它只是“查看”的工具 原始数据帧的片段,具有只读访问权限

当您尝试执行dfbreed['x'] = dfbreed.apply(...)时,您 实际尝试违反只读访问模式

要避免此错误,请将dfbreed创建为“独立”数据帧:

dfbreed = df3[['Breed']].copy()

现在dfbreed有自己的数据缓冲区,您可以自由更改数据

相关问题 更多 >