有人能解释这三种切片方法有何不同?
我已经看过这些文档了,我已经看到了这些 答案,但我仍然发现自己无法解释三者是如何不同的.对我来说,它们在很大程度上似乎是可以互换的,因为它们处于较低的切片水平.
例如,假设我们想获得a的前五行DataFrame.这三个都是如何运作的?
df.loc[:5]
df.ix[:5]
df.iloc[:5]
Run Code Online (Sandbox Code Playgroud)
有人可以提出三种情况,其中使用的区别更清晰吗?
我无法在海边拍摄一个画布.这是我可重复的数据:
people = ['Hannah', 'Bethany', 'Kris', 'Alex', 'Earl', 'Lori']
reputation = ['awesome', 'cool', 'brilliant', 'meh', 'awesome', 'cool']
dictionary = dict(zip(people, reputation))
df = pd.DataFrame(dictionary.values(), dictionary.keys())
df = df.rename(columns={0:'reputation'})
Run Code Online (Sandbox Code Playgroud)
然后我想得到一个条形图,显示不同声誉的价值计数.我试过了:
sns.barplot(x = 'reputation', y = df['reputation'].value_counts(), data = df, ci = None)
Run Code Online (Sandbox Code Playgroud)
和
sns.barplot(x = 'reputation', y = df['reputation'].value_counts().values, data = df, ci = None)
Run Code Online (Sandbox Code Playgroud)
但两者都返回空白图.
知道我能做些什么才能得到这个吗?
这是一个微不足道的问题,我还没有找到一个明确的答案:
我有一个Series对象:
random = pd.Series(np.random.randint(10, 10)))
Run Code Online (Sandbox Code Playgroud)
我想用0替换大于1的所有值.我该怎么做?我已经尝试过Random.replace()但没有成功,我知道你可以在DataFrame中轻松完成这项工作,但是如何在Series对象中完成呢?
我在Windows计算机上安装了Anaconda,Spyder工作正常,但通过静态代码分析功能运行pylint会出错.Pylint是通过Conda安装的.
注意:Spyder中的错误不允许我直接复制和粘贴文本.使用图片到文本转换器来获取下面的代码,这样可能会有几个字符关闭...
No config file found, using default configuration Traceback (most recent call last):
File "C: \Users\ Username \AppData \Local \Continuum \Anaconda \Scripts\pylint-script.py", line 2, in <module>
run_pylint()
File "C: \Users\ USERNAME \AppData \Local \Continuum \Anaconda \lib\site-packages\pylint\_init_.py", line 23, in run_pylint
Run(sys.argv[1:])
File "C: \Users\ USERNAME \AppData \Local \Continuum \Anaconda \lib\site-packages\pylint\lint.py", line 1313, in _init_
lintercheck(args)
File "C: \Users\ USERNAME \AppData \Local \Continuum \Anaconda \lib\site-packages\pylint\lint.py", line 729, in check
self._do_check(files_or_modules)
File "C: \Users\ USERNAME \AppData \Local \Continuum \Anaconda \lib\site-packages\pylint\lint.py", line …Run Code Online (Sandbox Code Playgroud) 我无法if __name == '__main__'在IPython,Spyder环境中使用这个技巧.我已经尝试了这个线程中给出的每个方法:
如果在IPython中__name__ =='__ main__'
这是我的超级简化模块
Module1.py
Class UnitTest():
print 'Mod1 UnitTest!'
if __name__ == '__main__':
UnitTest()
Run Code Online (Sandbox Code Playgroud)
Module2.py
import Module1
Class UnitTest():
print 'Mod2 UnitTest!'
if __name__ == '__main__':
UnitTest()
Run Code Online (Sandbox Code Playgroud)
所以我运行Module2.py,我总是看到两个Mod2 UnitTest并Mod1 UnitTest打印出来.这些是在IPython内核中执行的.我只Mod2 UnitTest想要显示消息.
知道怎么了?
我想在某些自定义范围之间找到我的数据计数.
说我有一些数据:
import random
my_randoms = random.sample(xrange(100), 10)
test = pd.DataFrame(my_randoms,columns = ["x"])
Run Code Online (Sandbox Code Playgroud)
如何生成显示不同范围之间的值数的数据框?例如,假设我想看看在0-19,20-39,40-59,60-79,80-100之间出现了多少个值.输出数据框将有一列包含这些范围,另一列包含计数.
我可以想到一些丑陋的方法,包括使用.apply获取一个新的列列表,说明它们之间的值(然后做一个groupby),但我怀疑pandas有一种更清洁的方式潜伏着.
我很难在数据帧中或者在groupby中解决回顾或翻转问题.
以下是我拥有的数据帧的简单示例:
fruit amount
20140101 apple 3
20140102 apple 5
20140102 orange 10
20140104 banana 2
20140104 apple 10
20140104 orange 4
20140105 orange 6
20140105 grape 1
…
20141231 apple 3
20141231 grape 2
Run Code Online (Sandbox Code Playgroud)
我需要计算每天前3天每种水果'量'的平均值,并创建以下数据框:
fruit average_in_last 3 days
20140104 apple 4
20140104 orange 10
...
Run Code Online (Sandbox Code Playgroud)
例如在20140104,前3天是20140101,20140102和20140103(注意数据框中的日期不连续且20140103不存在),苹果的平均数量是(3 + 5)/ 2 = 4和橙色是10/1 = 10,其余为0.
样本数据框非常简单,但实际数据框更复杂,更大.希望有人能对此有所了解,谢谢你提前!
在将数据查询到pandas数据帧时,有没有办法保留SqlAlchemy属性名称?
这是我的数据库的简单映射.对于学校表,我将"学校名称"的"SchoolDistrict"重命名为更短的"地区".我从DBA中删除了几个层,因此在源代码中更改它们是不可行的.
class School(Base):
__tablename__ = 'DimSchool'
id = Column('SchoolKey', Integer, primary_key=True)
name = Column('SchoolName', String)
district = Column('SchoolDistrict', String)
class StudentScore(Base):
__tablename__ = 'FactStudentScore'
SchoolKey = Column('SchoolKey', Integer, ForeignKey('DimSchool.SchoolKey'), primary_key = True)
PointsPossible = Column('PointsPossible', Integer)
PointsReceived = Column('PointsReceived', Integer)
school = relationship("School", backref='studentscore')
Run Code Online (Sandbox Code Playgroud)
所以当我查询类似的东西:
query = session.query(StudentScore, School).join(School)
df = pd.read_sql(query.statement, query.session.bind)
Run Code Online (Sandbox Code Playgroud)
我在返回的DataFrame df中得到了列的基础'SchoolDistrict'名称,而不是我的属性名称.
编辑:更令人讨厌的情况是表格中存在重复的列名称.例如:
class Teacher(Base):
__tablename__ = 'DimTeacher'
id = Column('TeacherKey', Integer, primary_key=True)
fname = Column('FirstName', String)
lname = Column('FirstName', String)
class Student(Base):
__tablename__ = 'DimStudent' …Run Code Online (Sandbox Code Playgroud) 这个问题感觉非常简单,但我一直无法找到答案。
我有一个 ORM 查询对象,比如说
query_obj = session.query(Class1).join(Class2).filter(Class2.attr == 'state')
Run Code Online (Sandbox Code Playgroud)
我可以像这样将其读入数据帧:
testdf = pd.read_sql(query_obj.statement, query_obj.session.bind)
Run Code Online (Sandbox Code Playgroud)
但我真正想做的是使用传统的 SQL 查询而不是 ORM:
with engine.connect() as connection:
# Execute the query against the database
results = connection.execute(query_obj)
# Fetch all the results of the query
fetchall = results.fetchall()
# Build a DataFrame with the results
dataframe = pd.DataFrame(fetchall)
Run Code Online (Sandbox Code Playgroud)
其中 query 是传统的 SQL 字符串。现在,当我运行它时,我收到了“query_obj 不可执行”这样的错误。有人知道如何将 ORM 查询转换为传统查询吗?另外,在获取数据框后如何获取列?
为什么我这样做的上下文:我在我的数据库之上设置了一个 ORM 层,并使用它来将数据查询到Pandas DataFrame. 它有效,但它经常使我的记忆力最大化。我想通过一些字符串折叠来减少我的内存开销(此处概述的第 3 步:http : //www.mobify.com/blog/sqlalchemy-memory-magic/)。这需要(如果我在这里错了,请纠正我)不使用 read_sql 字符串,而是将查询的返回处理为原始元组。
是否有一种简单的方法可以在数据框中提取不同的值组合?我已经将pd.Series.unique()用于单列,但是多列呢?
示例数据:
df = pd.DataFrame(data=[[1, 'a'], [2, 'a'], [3, 'b'], [3, 'b'], [1, 'b'], [1, 'b']],
columns=['number', 'letter'])
Expected output:
(1, a)
(2, a)
(3, b)
(1, b)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要一个单独的具有不同值的元组的Series对象.