假设我有两个表:people_all
并且people_usa
都具有相同的结构,因此具有相同的主键.
我怎样才能得到一张不在美国的人的表?在SQL中我会做类似的事情:
select a.*
from people_all a
left outer join people_usa u
on a.id = u.id
where u.id is null
Run Code Online (Sandbox Code Playgroud)
什么是Python等价物?我想不出把这个where语句翻译成pandas语法的方法.
我能想到的唯一方法是向people_usa(例如people_usa['dummy']=1
)添加一个任意字段,进行左连接,然后只获取'dummy'为nan的记录,然后删除虚拟字段 - 这看起来有点复杂.
谢谢!
我已经意识到,除非显式或半显式声明日期列的格式(使用 dayfirst),否则在读取 csv 文件时,pandas 可以将不同的日期格式应用于同一列!一行可能是 dd/mm/yyyy,而同一列中的另一行可能是 mm/dd/yyyy! 疯狂甚至无法描述它!这是一个已知的错误吗?
为了演示:下面的脚本创建了一个非常简单的表,其中包含从 1 月 1 日到 31 日的日期,采用 dd/mm/yyyy 格式,将其保存到 csv 文件,然后读回 csv。
然后我使用 pandas.DatetimeIndex 来提取日期。好吧,前 12 天的天数为 1(当月和日都 < 13 时),然后是 13 14 等。这到底怎么可能?
我发现解决此问题的唯一方法是明确声明日期格式或仅使用 dayfirst=True 声明日期格式。但这很痛苦,因为这意味着即使我使用有史以来格式最佳的日期导入 csv,我也必须声明日期格式!有没有更简单的方法?
Windows 10 上的 Pandas 0.23.4 和 Python 3.7.1 发生在我身上
import numpy as np
import pandas as pd
df=pd.DataFrame()
df['day'] =np.arange(1,32)
df['day']=df['day'].apply(lambda x: "{:0>2d}".format(x) )
df['month']='01'
df['year']='2018'
df['date']=df['day']+'/'+df['month']+'/'+df['year']
df.to_csv('mydates.csv', index=False)
#same results whether you use parse_dates or not
imp = pd.read_csv('mydates.csv',parse_dates=['date']) …
Run Code Online (Sandbox Code Playgroud) 我使用RStudio;我有script1导入script2与source
; script2中的函数会导致错误。第一次发生时,Rstudio告诉我x行的脚本1导致y行的script2错误。如果我重新运行它,它只会告诉我有关script2中的错误。为什么?这会使调试变得比原本要痛苦得多。
更详细:
我有一个myfun.R
包含此功能的文件(当然,这只是一个玩具示例):
sum_2_nums <- function(x,y) {
out <- x + y
return(out)
}
Run Code Online (Sandbox Code Playgroud)
然后,我使用将该函数导入另一个文件source
:
source("myfun.R")
mysum <- sum_2_nums(3,"hello")
Run Code Online (Sandbox Code Playgroud)
RStudio设置为debug -> on error -> error inspector
。当我运行上面的代码时,我看到:
这告诉我myfun.R第12行中的错误是由try_traceback.R第13行引起的。
但是,如果我再次运行该脚本,则会得到:
即错误不再追溯到try_traceback.R
。我需要traceback()
在控制台中键入才能看到。为什么?第二次的不同行为确实使我感到困惑。这使调试不必要地痛苦了!有办法避免吗?
注意这个问题是不是一个重复此:他们可能看起来相似,但答案给出了使用的有echo=TRUE
或verbose=TRUE
没有不解决对跟踪误差的第一.R文件我的观点。
我在这里看到了相同的问题,但仍未得到解答。
为了澄清,在回答一些评论时:
就像我说的,如果我单击“调试”->“错误”->“我看到”“错误检查器”被选中。
如果我options(error=function()traceback(1))
在控制台中键入,屏幕上什么也不会发生,但是“错误检查器”被取消选择
我的代码中没有其他内容。这是一个玩具示例,仅显示了我所显示的线条,而没有其他内容。我不知道还有什么可以澄清的-任何指导将不胜感激。
我对R非常陌生。我使用Python进行数据分析,但对R感到好奇。我听说R的调试麻烦得多,并且想自己尝试一下。假设即使只追溯这样的常规错误也是有问题的,我也不会花很多时间学习R,所以我想了解我是否做错了什么,或者调试和追溯总是R中的这个
当我说“运行”时,我的意思是单击RStudio中的“源”按钮(“运行”旁边的按钮
sessionInfo()显示:
sessionInfo() R version 3.5.3 (2019-03-11) Platform:
x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8 …
Run Code Online (Sandbox Code Playgroud) 我试图理解这个简单的SQL语句的等价物是什么:
select mykey, sum(Field1) as sum_of_field1, avg(Field1) as avg_field1, min(field2) as min_field2
from df
group by mykey
Run Code Online (Sandbox Code Playgroud)
我明白我可以将字典传递给agg()函数:
f = {'Field1':'sum',
'Field2':['max','mean'],
'Field3':['min','mean','count'],
'Field4':'count'
}
grouped = df.groupby('mykey').agg(f)
Run Code Online (Sandbox Code Playgroud)
但是,结果列名似乎是由pandas自动选择的:('Field1','sum')
等等.
有没有办法为列名传递字符串,所以字段不是('Field1','sum')
我可以选择的东西,比如sum_of_field1?
谢谢.我查看了这里的文档:http://pandas.pydata.org/pandas-docs/stable/groupby.html 但是找不到答案.
我有一个包含日期列的数据框。
我知道如何将日期移动固定的月份数(例如,向 x 列中的所有日期添加 3 个月);但是,我无法弄清楚如何将日期移动几个月,这不是固定的,而是数据框的另一列。
有任何想法吗?
我在下面复制了一个最小的例子。我得到的错误是:
The truth value of a Series is ambiguous
Run Code Online (Sandbox Code Playgroud)
多谢!
import pandas as pd
import numpy as np
import datetime
df = pd.DataFrame()
df['year'] = np.arange(2000,2010)
df['month'] = 3
df['mydate'] = pd.to_datetime( (df.year * 10000 + df.month * 100 +1).apply(str), format='%Y%m%d')
df['month shift'] = np.arange(0,10)
# if I want to shift mydate by 3 months, I can convert it to DatetimeIndex and use dateOffset:
df['my date shifted by 3 months'] = pd.DatetimeIndex( df['mydate'] …
Run Code Online (Sandbox Code Playgroud) 我使用的是pandas 0.16.2,numpy 1.9.2和numba 0.20.
有没有办法让numba在nopython模式下支持字符串数组?或者,我可以以某种方式将字符串转换为numba会识别的数字吗?
我必须在字符串数组(来自pandas数据帧的列)上运行某些循环; 如果我可以使用numba,代码会快得多.
我想出了这个最小的例子来说明我的意思:
import numpy as np
import numba
x=np.array(['some','text','this','is'])
@numba.jit(nopython=True)
def numba_str(txt):
x=0
for i in xrange(txt.size):
if txt[i]=='text':
x += 1
return x
print numba_str(x)
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Failed at nopython (nopython frontend)
Undeclared ==([char x 4], str)
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一个包含两列的pandas数据框:x和value.我想找到x == 10的所有行,并且对于所有这些行,设置值= 1,000.我尝试了下面的代码,但我得到了警告
A value is trying to be set on a copy of a slice from a DataFrame.
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过使用.loc或.ix避免这种情况,但我首先需要找到满足x == 10条件的所有行的位置或索引.有更直接的方式吗?
谢谢!
import numpy as np
import pandas as pd
df=pd.DataFrame()
df['x']=np.arange(10,14)
df['value']=np.arange(200,204)
print df
df[ df['x']== 10 ]['value'] = 1000 # this doesn't work
print df
Run Code Online (Sandbox Code Playgroud) 我正在使用string.format()
将一些数字格式化为字符串。是否format()
可以选择显示特定文本(例如“不可用”)而不是 nan?我找不到。还是我必须手动更换?
为了澄清评论中提出的观点,这里提出了一个标题相似但上下文不同的问题。我的问题是不同的,因为该问题的作者想要将 'nan' 作为输出,但由于已修复的错误而得到其他内容。
相反,我想了解 format() 是否具有将“nan”替换为其他文本的内置选项。当然,我非常感谢我可以自己手动进行替换,但只是想知道这是否是format()
.
I use pandas.cut() to discretise a continuous variable into a range, and then group by the result.
After a lot of swearing because I couldn't figure out what was wrong, I have learnt that, if I don't supply custom labels to the cut() function, but rely on the default, then the output cannot be exported to excel. If I try this:
import pandas as pd
import numpy as np
writer = pd.ExcelWriter('test.xlsx')
wk = writer.book.add_worksheet('Test')
df= df= pd.DataFrame(np.random.randint(1,10,(10000,5)), columns=['a','b','c','d','e'])
df['range'] …
Run Code Online (Sandbox Code Playgroud) 我有一个带有一列权重和一个值的数据框。我需要:
有找到一种简单的方法吗?我找到了一种方法,但是似乎有点麻烦:
基本上,我正在寻找一种更好的方法来产生更平滑的曲线。
我的代码(带有一些随机数据)是:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.interpolate import make_interp_spline, BSpline
n=int(1e3)
df=pd.DataFrame()
np.random.seed(10)
df['w']=np.arange(0,n)
df['v']=np.random.randn(n)
df['ranges']=pd.cut(df.w, bins=50)
df['one']=1.
def func(x, df):
# func() gets called within a lambda function; x is the row, df is the entire table
b1= x['one'].sum()
b2 = x['w'].mean()
b3 = x['v'].mean()
b4=( x['w'] * x['v']).sum() / x['w'].sum() if x['w'].sum() >0 else …
Run Code Online (Sandbox Code Playgroud)