我刚刚将我的Pandas从0.11升级到0.13.0rc1.现在,该应用程序正在弹出许多新的警告.其中一个是这样的:
E:\FinReporter\FM_EXT.py:449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
quote_df['TVol'] = quote_df['TVol']/TVOL_SCALE
Run Code Online (Sandbox Code Playgroud)
我想知道究竟是什么意思?我需要改变什么吗?
如果我坚持使用,我应该如何暂停警告quote_df['TVol'] = quote_df['TVol']/TVOL_SCALE?
def _decode_stock_quote(list_of_150_stk_str):
"""decode the webpage and return dataframe"""
from cStringIO import StringIO
str_of_all = "".join(list_of_150_stk_str)
quote_df = pd.read_csv(StringIO(str_of_all), sep=',', names=list('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg')) #dtype={'A': object, 'B': object, 'C': np.float64}
quote_df.rename(columns={'A':'STK', 'B':'TOpen', 'C':'TPCLOSE', 'D':'TPrice', 'E':'THigh', 'F':'TLow', 'I':'TVol', 'J':'TAmt', 'e':'TDate', 'f':'TTime'}, inplace=True)
quote_df = quote_df.ix[:,[0,3,2,1,4,5,8,9,30,31]]
quote_df['TClose'] = quote_df['TPrice']
quote_df['RT'] …Run Code Online (Sandbox Code Playgroud) 我熟悉"矢量化"的概念,以及熊猫如何使用矢量化技术来加速计算.矢量化函数在整个系列或DataFrame上广播操作,以实现比传统迭代数据更大的加速.
但是,我很惊讶地看到很多代码(包括Stack Overflow的答案)提供了解决问题的方法,这些问题涉及使用for循环和列表推导来循环数据.阅读完文档后,对API有了不错的理解,我认为循环是"坏的",并且应该"永远"迭代数组,系列或DataFrame.那么,为什么我会不时地看到用户提出循环解决方案呢?
因此,要总结......我的问题是:
是否for循环真正的"坏"?如果不是,在什么情况下它们会比使用更传统的"矢量化"方法更好?1
1 - 虽然这个问题确实听起来有点宽泛,但事实是,当for循环通常比传统的迭代数据更好时,存在非常具体的情况.这篇文章旨在为后人捕捉这一点.
我和这里发布的问题有类似的问题:
Pandas DataFrame:从列中的字符串中删除不需要的部分
我需要从DataFrame中的字符串中删除换行符.基本上,我使用python的json模块访问了一个api,这一切都没问题.创建DataFrame也非常有效.但是,当我想最终将最终结果输出到csv时,我有点卡住了,因为有新行在csv文件中创建了错误的"新行".
所以基本上我试图改变这个:
'......这是一个段落.
这是另一段...'
进入这个:
'......这是一个段落.这是另一段...'
我不关心为段落中保留任何类型的'\n'或任何特殊符号.所以它可以被剥夺.
我尝试了一些变化:
misc['product_desc'] = misc['product_desc'].strip('\n')
AttributeError: 'Series' object has no attribute 'strip'
Run Code Online (Sandbox Code Playgroud)
这是另一个
misc['product_desc'] = misc['product_desc'].str.strip('\n')
TypeError: wrapper() takes exactly 1 argument (2 given)
misc['product_desc'] = misc['product_desc'].map(lambda x: x.strip('\n'))
misc['product_desc'] = misc['product_desc'].map(lambda x: x.strip('\n\t'))
Run Code Online (Sandbox Code Playgroud)
没有错误消息,但换行符也不会消失.同样的事情:
misc = misc.replace('\n', '')
Run Code Online (Sandbox Code Playgroud)
写入csv行是这样的:
misc_id.to_csv('C:\Users\jlalonde\Desktop\misc_w_id.csv', sep=' ', na_rep='', index=False, encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)
熊猫的版本是0.9.1
谢谢!:)
这似乎是一个固有的简单任务,但我发现很难从我的整个数据框中删除' '并返回每列中的数值,包括没有' ' 的数字.日期框架包含数百个列,简而言之:
Time A1 A2
2.0002546296 1499 1592
2.0006712963 1252 1459
2.0902546296 1731 2223
2.0906828704 1691 1904
2.1742245370 2364 3121
2.1764699074 2096 1942
2.7654050926 *7639* *8196*
2.7658564815 *7088* *7542*
2.9048958333 *8736* *8459*
2.9053125000 *7778* *7704*
2.9807175926 *6612* *6593*
3.0585763889 *8520* *9122*
Run Code Online (Sandbox Code Playgroud)
我没有写它来迭代df中的每一列但是就第一列而言,我已经想出了这个
df['A1'].str.replace('*','').astype(float)
Run Code Online (Sandbox Code Playgroud)
产量
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 NaN
9 NaN
10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
15 …Run Code Online (Sandbox Code Playgroud) 嘿,我已经看到了这个链接,但在那里他们已经使用了re模块,这就是我在这里发布的原因.希望您理解并删除副本.
这是链接.我想用re模块.
表:
A B C D
1 Q! W@ 2
2 1$ E% 3
3 S2# D! 4
Run Code Online (Sandbox Code Playgroud)
在这里,我想从column B和删除特殊字符C.我已经使用.transform()但我想re尽可能使用它,但我收到了错误.
输出:
A B C D E F
1 Q! W@ 2 Q W
2 1$ E% 3 1 E
3 S2# D! 4 S2 D
Run Code Online (Sandbox Code Playgroud)
我的代码:
df['E'] = df['B'].str.translate(None, ",!.; -@!%^&*)(")
Run Code Online (Sandbox Code Playgroud)
它只有在我知道什么是特殊字符时才有用.
但我想使用re哪种方式最好.
import re
#re.sub(r'\W+', '', your_string)
df['E'] = re.sub(r'\W+', '', df['B'].str) …Run Code Online (Sandbox Code Playgroud) 由于一些编码困难,我无法导出我的数据帧之一。
sjM.dtypes
Customer Name object
Total Sales float64
Sales Rank float64
Visit_Frequency float64
Last_Sale datetime64[ns]
dtype: object
Run Code Online (Sandbox Code Playgroud)
csv 导出工作正常
path = 'c:\\test'
sjM.to_csv(path + '.csv') # Works
Run Code Online (Sandbox Code Playgroud)
但excel导出失败
sjM.to_excel(path + '.xls')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "testing.py", line 338, in <module>
sjM.to_excel(path + '.xls')
File "c:\Anaconda\Lib\site-packages\pandas\core\frame.py", line 1197, in to_excel
excel_writer.save()
File "c:\Anaconda\Lib\site-packages\pandas\io\excel.py", line 595, in save
return self.book.save(self.path)
File "c:\Anaconda\Lib\site-packages\xlwt\Workbook.py", line 662, in save
doc.save(filename, self.get_biff_data())
File "c:\Anaconda\Lib\site-packages\xlwt\Workbook.py", line 637, in get_biff_data …Run Code Online (Sandbox Code Playgroud) 我有一个CSV文件,其行如下所示:
ID,98.4,100M,55M,65M,75M,100M,75M,65M,100M,98M,100M,100M,92M,0#,0N#,
Run Code Online (Sandbox Code Playgroud)
我可以用它阅读
#!/usr/bin/env python
import pandas as pd
import sys
filename = sys.argv[1]
df = pd.read_csv(filename)
Run Code Online (Sandbox Code Playgroud)
给定一个特定的列,我想的行由ID,然后输出的平均值和标准偏差对每个ID分开.
我的第一个问题是,如何从数字中删除所有非数字部分,例如"100M"和"0N#",它们应分别为100和0.
我也试过循环相关的标题和使用
df[header].replace(regex=True,inplace=True,to_replace=r'\D',value=r'')
Run Code Online (Sandbox Code Playgroud)
正如Pandas DataFrame中所建议的那样:从列中的字符串中删除不需要的部分.
然而,这将98.4变为984.
参考: Pandas DataFrame:从列中的字符串中删除不需要的部分
参考上面链接中提供的答案.我研究了一些正则表达式,我打算深入研究,但与此同时我可以使用一些帮助.
我的数据框是这样的:
DF:
c_contofficeID
0 0109
1 0109
2 3434
3 123434
4 1255N9
5 0109
6 123434
7 55N9
8 5599
9 0109
Run Code Online (Sandbox Code Playgroud)
Psuedo Code
如果前两个字符是12则删除它们.或者,在前两个字符中没有12的字符中添加12.
结果如下:
c_contofficeID
0 0109
1 0109
2 3434
3 3434
4 55N9
5 0109
6 3434
7 55N9
8 5599
9 0109
Run Code Online (Sandbox Code Playgroud)
我正在使用上面链接中的答案作为起点:
df['contofficeID'].replace(regex=True,inplace=True,to_replace=r'\D',value=r'')
Run Code Online (Sandbox Code Playgroud)
我尝试过以下方法:
尝试1)
df['contofficeID'].replace(regex=True,inplace=True,to_replace=r'[1][2]',value=r'')
Run Code Online (Sandbox Code Playgroud)
尝试2)
df['contofficeID'].replace(regex=True,inplace=True,to_replace=r'$[1][2]',value=r'')
Run Code Online (Sandbox Code Playgroud)
尝试3)
df['contofficeID'].replace(regex=True,inplace=True,to_replace=r'?[1]?[2]',value=r'')
Run Code Online (Sandbox Code Playgroud) 我有一个与此类似的问题:Pandas DataFrame:从列中的字符串中删除不需要的部分。
所以我使用了:
temp_dataframe['PPI'] = temp_dataframe['PPI'].map(lambda x: x.lstrip('PPI/'))
Run Code Online (Sandbox Code Playgroud)
大多数项目以“PPI/”开头,但不是全部。似乎当一个没有'PPI/'后缀的项目遇到这个错误时:
AttributeError: 'float' 对象没有属性 'lstrip'
我在这里错过了什么吗?
我有一个像这样的数据框:
number file
1 "[file1,file2]"
2 [file1]
3 "[file3,file4]
Run Code Online (Sandbox Code Playgroud)
我想删除". 这是我尝试过的:
data = df.replace([\"], '', regex=True)
Run Code Online (Sandbox Code Playgroud)
但是,我的数据框中没有任何变化。我该如何解决这个问题?
谢谢。