我有这样的数据帧:
A B C
0 1 0.749065 This
1 2 0.301084 is
2 3 0.463468 a
3 4 0.643961 random
4 1 0.866521 string
5 2 0.120737 !
Run Code Online (Sandbox Code Playgroud)
调用
In [10]: print df.groupby("A")["B"].sum()
Run Code Online (Sandbox Code Playgroud)
将返回
A
1 1.615586
2 0.421821
3 0.463468
4 0.643961
Run Code Online (Sandbox Code Playgroud)
现在我想为"C"列做"相同".因为该列包含字符串,sum()不起作用(尽管您可能认为它会连接字符串).我真正想看到的是每个组的一个列表或一组字符串,即
A
1 {This, string}
2 {is, !}
3 {a}
4 {random}
Run Code Online (Sandbox Code Playgroud)
我一直在努力想办法做到这一点.
Series.unique()(http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.unique.html)不起作用,尽管
df.groupby("A")["B"]
Run Code Online (Sandbox Code Playgroud)
是一个
pandas.core.groupby.SeriesGroupBy object
Run Code Online (Sandbox Code Playgroud)
所以我希望任何系列方法都能奏效.有任何想法吗?
我一直想知道......如果我正在读取一个400MB的csv文件到一个pandas数据帧(使用read_csv或read_table),有没有办法猜测这需要多少内存?只是想更好地了解数据框架和内存......
我正在尝试做一些相当简单的事情,将大型csv文件读入pandas数据帧.
data = pandas.read_csv(filepath, header = 0, sep = DELIMITER,skiprows = 2)
Run Code Online (Sandbox Code Playgroud)
代码要么失败MemoryError,要么永远不会完成.
任务管理器中的内存使用量停止在506 Mb,并且在5分钟没有变化且没有CPU活动的过程中我停止了它.
我使用的是pandas版本0.11.0.
我知道文件解析器曾经存在内存问题,但根据http://wesmckinney.com/blog/?p=543这应该已修复.
我试图读取的文件是366 Mb,如果我将文件剪切为短(25 Mb),则上面的代码可以正常工作.
还有一个弹出窗口告诉我它无法写入地址0x1e0baf93 ...
堆栈跟踪:
Traceback (most recent call last):
File "F:\QA ALM\Python\new WIM data\new WIM data\new_WIM_data.py", line 25, in
<module>
wimdata = pandas.read_csv(filepath, header = 0, sep = DELIMITER,skiprows = 2
)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\io\parsers.py"
, line 401, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\io\parsers.py"
, line 216, in _read
return parser.read()
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\io\parsers.py"
, …Run Code Online (Sandbox Code Playgroud) 我更精确地使用Python多处理
from multiprocessing import Pool
p = Pool(15)
args = [(df, config1), (df, config2), ...] #list of args - df is the same object in each tuple
res = p.map_async(func, args) #func is some arbitrary function
p.close()
p.join()
Run Code Online (Sandbox Code Playgroud)
这种方法具有巨大的内存消耗; 几乎占用了我所有的RAM(此时它变得非常慢,因此使多处理非常无用).我假设问题是这df是一个巨大的对象(一个大型的pandas数据帧),它会被复制到每个进程.我试过使用multiprocessing.Value共享数据帧而不复制
shared_df = multiprocessing.Value(pandas.DataFrame, df)
args = [(shared_df, config1), (shared_df, config2), ...]
Run Code Online (Sandbox Code Playgroud)
(正如Python多处理共享内存中所建议的那样),但是这给了我TypeError: this type has no size(与在Python进程之间共享一个复杂对象相同?,遗憾的是我不理解答案).
我第一次使用多处理,也许我的理解还不够好.是multiprocessing.Value实际上即使在这种情况下使用了正确的事情?我已经看到了其他建议(例如队列),但现在有点困惑.有什么选择可以共享内存,在这种情况下哪一个最好?
我编写了一个将pandas datetime日期转换为month-end的函数:
import pandas
import numpy
import datetime
from pandas.tseries.offsets import Day, MonthEnd
def get_month_end(d):
month_end = d - Day() + MonthEnd()
if month_end.month == d.month:
return month_end # 31/March + MonthEnd() returns 30/April
else:
print "Something went wrong while converting dates to EOM: " + d + " was converted to " + month_end
raise
Run Code Online (Sandbox Code Playgroud)
这个功能似乎很慢,我想知道是否有更快的替代方案?我注意到它很慢的原因是我在一个具有50'000个日期的数据帧列上运行它,并且我可以看到自引入该函数以来代码慢得多(在我将日期转换为月末之前).
df = pandas.read_csv(inpath, na_values = nas, converters = {open_date: read_as_date})
df[open_date] = df[open_date].apply(get_month_end)
Run Code Online (Sandbox Code Playgroud)
我不确定这是否相关,但我正在阅读如下日期:
def read_as_date(x):
return datetime.datetime.strptime(x, fmt)
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的pandas数据帧:
Balance Jan Feb Mar Apr
0 9.724135 0.389376 0.464451 0.229964 0.691504
1 1.114782 0.838406 0.679096 0.185135 0.143883
2 7.613946 0.960876 0.220274 0.788265 0.606402
3 0.144517 0.800086 0.287874 0.223539 0.206002
4 1.332838 0.430812 0.939402 0.045262 0.388466
Run Code Online (Sandbox Code Playgroud)
我想通过弄清楚从1月到4月的值是否单调递减(如在1和3行中的索引)来划分行,然后将每个组的余额相加,即最后我想要结束两个数字(减少时间序列为1.259299,其他数字为18.670919).
我想如果我可以添加一个"正在减少"的列中包含布尔值,我可以使用pandas的groupby来完成总和,但是我该如何创建这个列呢?
谢谢,安妮
我有一个Pandas系列,例如像这样
s = pandas.Series(data = [1,2,3], index = ['A', 'B', 'C'])
Run Code Online (Sandbox Code Playgroud)
如何更改索引的顺序,以便s变为
B 2
A 1
C 3
Run Code Online (Sandbox Code Playgroud)
我试过了
s['B','A','C']
Run Code Online (Sandbox Code Playgroud)
但这会给我一个关键错误.(在这个特定的例子中,我可能会在构造系列时处理索引的顺序,但是我希望在创建系列之后有办法完成此操作.)
我想从 csv 文件中读取以下数据:
id;type;start;end
Test;OIS;01/07/2016;01/07/2018
;;;
;;;
Run Code Online (Sandbox Code Playgroud)
但是,pandas read_csv 也会尝试读取空行;;;。有没有办法自动忽略这些空数据的尾随行?
这些行导致了问题,因为我使用read_csvwith converters,并且转换器中的函数在遇到无效数据时会尽职尽责地抛出异常,这意味着我什至没有到达有效的数据帧。我可以更改函数以将无效数据转换为NaN然后NaN从数据框中删除s,但随后我会默默地删除错误数据以及那些空行。
一些澄清:
我刚刚在我的一个 Python 模块中添加了一个单元测试,但鼻子拒绝接受。测试看起来像这样:
class TestMargin(unittest.TestCase):
def setUp(self):
super().setUp()
def test_margin(self):
self.assertTrue(False)
Run Code Online (Sandbox Code Playgroud)
我希望这个测试失败,但似乎它甚至没有被接受。我正在用--all-modules标志运行鼻子,其他模块中的测试确实被选中,所以它似乎不是鼻子的通用问题。我已经检查了鼻子的文档,但看不出为什么这个测试不应该工作的任何充分理由......
编辑:我通过(有点随意)__init__.py在模块级别添加一个空来解决这个问题。但这为什么会有帮助?
我已经在python中编写了一个单元测试,并希望在我运行鼻子时将其拾起.当我在包含测试的文件上运行鼻子时,它工作正常,即
nosetests myFile.py
Run Code Online (Sandbox Code Playgroud)
但不是在我跑的时候
nosetests
Run Code Online (Sandbox Code Playgroud)
在同一目录中.我以为鼻子会在你运行它的目录中自动获取所有测试?知道如何让它工作吗?该目录中的各种文件中有更多测试,我希望能够同时运行它们.
这是我的测试看起来像:
class testSimple(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def testStupid(self):
self.Assert(False)
Run Code Online (Sandbox Code Playgroud)