我发现在尝试引用它之前,我经常需要检查数据框中是否存在列或行.例如,我最终添加了许多代码,如:
if 'mycol' in df.columns and 'myindex' in df.index: x = df.loc[myindex, mycol]
else: x = mydefault
Run Code Online (Sandbox Code Playgroud)
有没有办法更好地做到这一点?例如,在我可以做的任意对象上x = getattr(anobject, 'id', default)
- 在熊猫中有类似的东西吗?真的有办法实现我正在做的更优雅吗?
我有以下数据框.
id int_date
1 20160228
2 20161231
3 20160618
4 20170123
5 20151124
Run Code Online (Sandbox Code Playgroud)
如何将int格式的上述日期转换为mm/dd/yyyy的日期格式?想要以特定格式进行进一步的excel操作吗?
id int_date
1 02/28/2016
2 12/31/2016
3 06/18/2016
4 01/23/2017
5 11/24/2015
Run Code Online (Sandbox Code Playgroud)
是否也可以生成第三列,单词只有几个字?像int_date的1月,2月等?
我试过跟随
date = datetime(year=int(s[0:4]), month=int(s[4:6]), day=int(s[6:8]))
Run Code Online (Sandbox Code Playgroud)
但是date是在datetime对象中,如何把它作为日期放在pandas DF中?
更新到 pandas 1.4 后,当使用 frame.append 将字典附加到 Pandas DataFrame 时,我现在收到以下警告。
FutureWarning: The frame.append method is deprecated and will be
removed from pandas in a future version. Use pandas.concat instead.
Run Code Online (Sandbox Code Playgroud)
下面是代码。尽管我想解决该警告,但这仍然有效。
report = report.append({
"period":period,
"symbol":symbol,
"start_date":start_date,
"start_price":start_price,
"start_market_cap":start_market_cap,
"end_date":end_date,
"end_price":end_price,
"end_market_cap":end_market_cap,
"return":return_
},ignore_index=True)
Run Code Online (Sandbox Code Playgroud)
我已将代码更新为以下内容,这会引发不同的警告:
report = pd.concat([report,{
"period":period,
"symbol":symbol,
"start_date":start_date,
"start_price":start_price,
"start_market_cap":start_market_cap,
"end_date":end_date,
"end_price":end_price,
"end_market_cap":end_market_cap,
"return":return_
}],ignore_index=True)
TypeError: cannot concatenate object of type '<class 'dict'>'; only Series and DataFrame objs are valid
Run Code Online (Sandbox Code Playgroud)
2个问题:第一个警告是错误的吗?pandas 1.4 实现这一目标的方法是什么?谢谢。
我确定这可能非常简单,但我无法弄清楚如何通过其datetime索引切片pandas HDFStore表来获取特定的行范围.
我有一个看起来像这样的表:
mdstore = pd.HDFStore(store.h5)
histTable = '/ES_USD20120615_MIDPOINT30s'
print(mdstore[histTable])
open high low close volume WAP \
date
2011-12-04 23:00:00 1266.000 1266.000 1266.000 1266.000 -1 -1
2011-12-04 23:00:30 1266.000 1272.375 1240.625 1240.875 -1 -1
2011-12-04 23:01:00 1240.875 1242.250 1240.500 1242.125 -1 -1
...
[488000 rows x 7 columns]
Run Code Online (Sandbox Code Playgroud)
例如,我想从2012-01-11 23:00:00到2012-01-12 22:30:00获取范围.如果它是在df我只会使用日期时间来切片索引,但我无法弄清楚如何直接从存储表中执行此操作,因此我不必将整个内容加载到内存中.我尝试了,mdstore.select(histTable, where='index>20120111')
并且在11日和12日我得到了所有东西,但是我看不出如何增加时间.
我有一个 python 控制台脚本,我想向其中添加一个基本状态窗口,因此在不太了解 pyqt 的情况下,我添加了一个窗口。如果我从主线程启动 pyqt,它会阻塞其他所有内容,因此我从另一个线程启动它。几个月来它一直运行良好,但我刚刚注意到一个警告(不知道我之前是如何错过的):
WARNING: QApplication was not created in the main() thread.
我想知道这可能会导致什么问题。
这是我正在使用的代码的精简版本,仅更新窗口标题栏:
from PyQt4 import QtGui, QtCore
import threading
import sys
from time import sleep
class MainWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(MainWidget, self).__init__(parent)
self.setWindowTitle(statusLine)
self.timer = QtCore.QBasicTimer()
self.timer.start(500, self)
def updateWindow(self):
self.setWindowTitle(statusLine)
def timerEvent(self, event):
if event.timerId() == self.timer.timerId():
self.updateWindow()
else:
super(MainWidget, self).timerEvent(event)
def startWindow():
app = QtGui.QApplication(sys.argv)
mw = MainWidget()
mw.show()
app.exec_()
if __name__ == '__main__':
global statusLine
statusLine = 'foo'
threadWindow = threading.Thread(target=startWindow)
threadWindow.start() …
Run Code Online (Sandbox Code Playgroud) 在 Python 3.3 中,有没有一种方法可以一步将 url 保存到文件并将文件保存在内存中?我想避免下载文件两次(浪费带宽),也想避免将文件下载到磁盘,然后从磁盘读取文件(浪费磁盘 IO)。
要将其下载到内存中,我看到:
import urllib.request
myurl = 'http://blahblah/acsvfile.csv'
myreq = urllib.request.urlopen(myurl)
mydata = myreq.read()
Run Code Online (Sandbox Code Playgroud)
并将其直接下载到磁盘,我看到了这一点(它似乎很快就会被弃用):
urllib.request.urlretrieve(myurl, myfilename)
Run Code Online (Sandbox Code Playgroud)
但是我看不到如何让 urlopen 也将文件的原始副本保存到磁盘,或者 urlretrieve 也让我读取 url 的数据。
提前感谢您的任何想法。
我想复制qt表的选定部分,包括标题。默认的qt表副本仅复制一个单元格,而我需要整个选择,可以是多列和多行。我已经从不同的地方(大部分是在这里)将一些代码拼接在一起,并且似乎只工作于单元格(数据)而不是标头,但它似乎运作良好。我也需要一些帮助来获取选择的标题。这是我瘦下来的样品:
from PyQt4 import QtGui, QtCore
import sys
class MainWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(MainWidget, self).__init__(parent)
self.table = QtGui.QTableWidget(parent=self)
self.table.setColumnCount(2)
self.table.setRowCount(2)
self.table.setHorizontalHeaderLabels(['col1','col2'])
self.table.setVerticalHeaderLabels(['row1','row2'])
self.table.setItem(0,0,QtGui.QTableWidgetItem('foo'))
self.table.setItem(0,1,QtGui.QTableWidgetItem('bar'))
self.table.setItem(1,0,QtGui.QTableWidgetItem('baz'))
self.table.setItem(1,1,QtGui.QTableWidgetItem('qux'))
layout = QtGui.QGridLayout()
layout.addWidget(self.table, 1, 0)
self.setLayout(layout)
self.clip = QtGui.QApplication.clipboard()
def keyPressEvent(self, e):
if (e.modifiers() & QtCore.Qt.ControlModifier):
selected = self.table.selectedRanges()
if e.key() == QtCore.Qt.Key_C: #copy
s = ""
for r in xrange(selected[0].topRow(), selected[0].bottomRow()+1):
for c in xrange(selected[0].leftColumn(), selected[0].rightColumn()+1):
try:
s += str(self.table.item(r,c).text()) + "\t"
except AttributeError:
s += "\t"
s = s[:-1] …
Run Code Online (Sandbox Code Playgroud)