我有一个数据框如下
itm Date Amount
67 420 2012-09-30 00:00:00 65211
68 421 2012-09-09 00:00:00 29424
69 421 2012-09-16 00:00:00 29877
70 421 2012-09-23 00:00:00 30990
71 421 2012-09-30 00:00:00 61303
72 485 2012-09-09 00:00:00 71781
73 485 2012-09-16 00:00:00 NaN
74 485 2012-09-23 00:00:00 11072
75 485 2012-09-30 00:00:00 113702
76 489 2012-09-09 00:00:00 64731
77 489 2012-09-16 00:00:00 NaN
Run Code Online (Sandbox Code Playgroud)
当我尝试将一个函数应用于Amount列时,我得到以下错误.
ValueError: cannot convert float NaN to integer
Run Code Online (Sandbox Code Playgroud)
我尝试使用数学模块中的.isnan应用函数我已经尝试过pandas .replace属性我尝试了pandas 0.9中的.sparse数据属性我也尝试过函数中的NaN == NaN语句.我也看过这篇文章如何在R数据帧中用零替换NA值?同时看一些其他文章.我尝试的所有方法都没有工作或者没有认识到NaN.任何提示或解决方案将不胜感激.
是否可以只合并一些列?我有一个DataFrame df1,列x,y,z和df2,列x,a,b,c,d,e,f等.
我想在x上合并两个DataFrame,但我只想合并列df2.a,df2.b - 而不是整个DataFrame.
结果将是具有x,y,z,a,b的DataFrame.
我可以合并然后删除不需要的列,但似乎有一个更好的方法.
我喜欢熊猫,并且已经使用它多年并且非常自信我能够很好地处理如何对数据帧进行子集并适当地处理视图与副本(尽管我使用了大量的断言来确定).我也知道有很多关于SettingWithCopyWarning的问题,例如如何处理Pandas中的SettingWithCopyWarning? 以及一些最新的指南,当它发生时缠绕你的头,例如在熊猫中理解SettingWithCopyWarning.
但是我也知道具体的事情,例如这个答案的引用不再出现在最近的文档(0.22.0)中,并且许多事情已经被多年来弃用(导致一些不合适的旧的SO答案),并且事情正在继续改变.
最近,在教导大熊猫完成新手的基本常规Python知识,例如避免链式索引(和使用.iloc/ .loc)之后,我仍然很难提供一般的经验法则来了解何时注意SettingWithCopyWarning(例如何时重要)忽略它是安全的).
我个人发现根据一些规则(例如切片或布尔运算)对数据帧进行子集化的特定模式,然后修改该子集,与原始数据帧无关,是比文档建议的更常见的操作.在这种情况下,我们希望修改副本而不是原始副本,并且警告对新手来说是混乱/可怕的.
我知道提前查看视图与副本的关系
并不容易,例如Pandas用来生成视图与副本的规则是什么?
在Pandas中检查数据框是复制还是查看
因此,我正在寻找一个更普遍(初学者友好)问题的答案:何时对子集化数据帧执行操作会影响创建它的原始数据帧,以及它们何时独立?.
我已经在下面创建了一些我认为合理的案例,但我不确定是否存在"陷阱"我是否缺失或是否有更简单的方法来思考/检查这一点.我希望有人可以证实我对以下用例的直觉是正确的,因为它与我上面的问题有关.
import pandas as pd
df1 = pd.DataFrame({'A':[2,4,6,8,10],'B':[1,3,5,7,9],'C':[10,20,30,40,50]})
Run Code Online (Sandbox Code Playgroud)
1)警告:无
原始更改:否
# df1 will be unaffected because we use .copy() method explicitly
df2 = df1.copy()
#
# Reference: docs
df2.iloc[0,1] = 100
Run Code Online (Sandbox Code Playgroud)
2)警告:是(我真的不明白为什么)
原来改变了:没有
# df1 will be unaffected because .query() always returns a copy
#
# …Run Code Online (Sandbox Code Playgroud) 有没有一种简单的方法可以检查两个数据框是不同的副本还是不涉及操作的相同基础数据的视图?我试图抓住每一个生成的时间,并且考虑到规则似乎有多特殊,我想要一种简单的测试方法.
例如,我认为"id(df.values)"在各个视图中都是稳定的,但它们似乎不是:
# Make two data frames that are views of same data.
df = pd.DataFrame([[1,2,3,4],[5,6,7,8]], index = ['row1','row2'],
columns = ['a','b','c','d'])
df2 = df.iloc[0:2,:]
# Demonstrate they are views:
df.iloc[0,0] = 99
df2.iloc[0,0]
Out[70]: 99
# Now try and compare the id on values attribute
# Different despite being views!
id(df.values)
Out[71]: 4753564496
id(df2.values)
Out[72]: 4753603728
# And we can of course compare df and df2
df is df2
Out[73]: False
Run Code Online (Sandbox Code Playgroud)
其他答案我已经抬头试图给出规则,但似乎不一致,也不回答如何测试的问题:
当然: - http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy …
说我有一个数据帧
import pandas as pd
import numpy as np
foo = pd.DataFrame(np.random.random((10,5)))
Run Code Online (Sandbox Code Playgroud)
我从我的数据子集创建另一个数据帧:
bar = foo.iloc[3:5,1:4]
Run Code Online (Sandbox Code Playgroud)
确实bar持有这些元素的副本foo?有没有办法创建view这些数据呢?如果是这样,如果我尝试修改此视图中的数据会发生什么?Pandas是否提供任何类型的写时复制机制?
我有一些cvs数据在每行的末尾有一个空列.我想将其从导入中删除,或者在导入后删除它.我的cvs数据有不同数量的列.我尝试过使用df.tail(),但还没有设法选择最后一列.
employment=pd.read_csv('./data/spanish/employment1976-1987thousands.csv',index_col=0,header=[7,8],encoding='latin-1')
Run Code Online (Sandbox Code Playgroud)
数据:
4.- Resultados provinciales
Encuesta de Población Activa. Principales Resultados
Activos por provincia y grupo de edad (4).
Unidades:miles de personas
,Álava,,,,Albacete,,,,Alicante,,,,Almería,,,,Asturias,,,,Ávila,,,,Badajoz,,,,Balears (Illes),,,,Barcelona,,,,Burgos,,,,Cáceres,,,,Cádiz,,,,Cantabria,,,,Castellón de la Plana,,,,Ciudad Real,,,,Córdoba,,,,Coruña (A),,,,Cuenca,,,,Girona,,,,Granada,,,,Guadalajara,,,,Guipúzcoa,,,,Huelva,,,,Huesca,,,,Jaén,,,,León,,,,Lleida,,,,Lugo,,,,Madrid,,,,Málaga,,,,Murcia,,,,Navarra,,,,Orense,,,,Palencia,,,,Palmas (Las),,,,Pontevedra,,,,Rioja (La),,,,Salamanca,,,,Santa Cruz de Tenerife,,,,Segovia,,,,Sevilla,,,,Soria,,,,Tarragona,,,,Teruel,,,,Toledo,,,,Valencia,,,,Valladolid,,,,Vizcaya,,,,Zamora,,,,Zaragoza,,,,Ceuta y Melilla,,,,
,de 16 a 19 años,de 20 a 24 años,de 25 a 54 años,de 55 y más años,de 16 a 19 años,de 20 a 24 años,de 25 a 54 años,de 55 y más años,de 16 a 19 años,de 20 a 24 años,de …Run Code Online (Sandbox Code Playgroud) 我有一个大型数据帧(10米行,40列,7GB内存).我想创建一个视图,以便为表达复杂的视图创建一个简写名称,而不向内存使用添加另外2-4 GB.换句话说,我宁愿输入:
df2
Run Code Online (Sandbox Code Playgroud)
比:
df.loc[complicated_condition, some_columns]
Run Code Online (Sandbox Code Playgroud)
该文档指出,虽然使用.loc确保设置值修改原始数据帧,但仍无法保证返回的对象.loc是视图还是副本.
我知道我可以将条件和列列表分配给变量(例如df.loc[cond, cols]),但我通常很想知道是否可以创建数据帧的视图.
编辑:相关问题:
从Pandas数据帧中选择数据时,有时会返回一个视图,有时会返回一个副本.虽然这背后有一个逻辑,有没有办法强制Pandas 显式返回视图或副本?
有这个代码:
# assignment behaviour for integer
a = b = 0
print a, b # prints 0 0
a = 4
print a, b # prints 4 0 - different!
# assignment behaviour for class object
class Klasa:
def __init__(self, num):
self.num = num
a = Klasa(2)
b = a
print a.num, b.num # prints 2 2
a.num = 3
print a.num, b.num # prints 3 3 - the same!
Run Code Online (Sandbox Code Playgroud)
问题:
我正在尝试按总列对数据框进行排序:
df.sort_values(by='Total', ascending=False, axis=0, inplace =True)
Run Code Online (Sandbox Code Playgroud)
但我收到以下警告:
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
"""Entry point for launching an IPython kernel.
Run Code Online (Sandbox Code Playgroud)
当我点击链接时,它会打开并.loc建议使用方法。但在那之后,我遵循了.sort_values(),我发现使用 inplace = False 或 None 。
我的问题是,如果我得到一个未排序的数据框列,并且如果我不使用 inplace = True,我的数据框将被排序以供进一步使用,或者我必须为数据框分配一个新名称并保存它。
关于链式索引以及特定操作是进行查看还是复制,StackOverflow上有很多问题.(例如,这里或这里).我仍然没有完全理解它,但令人惊讶的部分是官方文档说"没人知道".(!?!??)这是文档中的一个例子; 你能告诉我他们是否真的这么说,或者他们只是在轻浮吗?
def do_something(df):
foo = df[['bar', 'baz']] # Is foo a view? A copy? Nobody knows!
# ... many lines here ...
foo['quux'] = value # We don't know whether this will modify df or not!
return foo
Run Code Online (Sandbox Code Playgroud)
真的吗?对于那个具体的例子,"没人知道"并且这是非确定性的,这是真的吗?在两个不同的数据帧上,这真的会有不同的表现吗?规则真的很复杂吗?或者这个人是否意味着有一个明确的答案,但只是大多数人都没有意识到这一点?
我想从 DataFrame 中选择列的子集而不复制数据。从这个答案看来,如果列有不同的数据类型,这是不可能的。有人可以确认吗?对我来说,似乎必须有一种方法,因为这个功能是如此重要。
例如,df.loc[:, ['a', 'b']]生成副本。
Can anyone provide an explanation of what it means to have a "slice" vs. a "copy" in pandas? I've been working with pandas for a while, and have internalized some rules of thumb about how to avoid the warnings.
But a colleague had some weird behavior today that I think is traceable to the same distinction, and it made me realize that I don't really understand what's going on under the hood and how it plays out in different situation. …