我有一个大的多索引多列数据框df,我没有在这里显示.我生成一个像这样的索引片:
subDf = df.sort_index(level=0).loc[:'e']
Run Code Online (Sandbox Code Playgroud)
然后该片包含NaN在索引的第二级:
>>> subDf.iloc[0:1]
change
robustness value
baseline NaN -14.5
Run Code Online (Sandbox Code Playgroud)
生成的csv to_csv()似乎是正确的:
>>> subDf.iloc[0:1].to_csv()
Out[15]: 'robustness,value,change\nbaseline,,-14.5\n'
Run Code Online (Sandbox Code Playgroud)
同样,to_html()功能就像被开除一样.但是,当我尝试获取latex_output时,NaN消失并50.00出现:
>>> subDf.iloc[0:1].to_latex()
Out[14]: u'\\begin{tabular}{llr}\n\\toprule\n & & change \\\\\nrobustness & value & \\\\\n\\midrule\nbaseline & 50.00 & -14.5 \\\\\n\\bottomrule\n\\end{tabular}\n'
Run Code Online (Sandbox Code Playgroud)
的50.00是不完全任意数,它是在原始数据帧中的多指数的第二层的最后一个值:
>>> df.index
Out[18]:
MultiIndex(levels=[[u'a', u'b', u'c', u'd', u'e', u'baseline', u'f'], [0.01, 0.04, 0.25, 0.75, 0.86, 0.99, 1.0, 2.0, 4.0, 10.0, 50.0]],
labels=[[5, 6, 6, 2, 2, 1, 3, 3, …Run Code Online (Sandbox Code Playgroud) 在 Groupby 文档中,我只看到了按应用于轴 0 索引或列标签的函数进行分组的示例。我没有看到讨论如何通过将函数应用于列而派生的标签进行分组的示例。我认为这将使用apply. 下面的例子是最好的方法吗?
df = pd.DataFrame({'name' : np.random.choice(['a','b','c','d','e'], 20),
'num1': np.random.randint(low = 30, high=100, size=20),
'num2': np.random.randint(low = -3, high=9, size=20)})
df.head()
name num1 num2
0 d 34 7
1 b 49 6
2 a 51 -1
3 d 79 8
4 e 72 5
def num1_greater_than_60(number_num1):
if number_num1 >= 60:
return 'greater'
else:
return 'less'
df.groupby(df['num1'].apply(num1_greater_than_60))
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过逗号解析出一列(也去除空白),然后将所有源/目标组合旋转到新行中。以下是数据示例:
Origin Destination Weight
PVG AMS, FRA 10,000
CAN, XMN LAX, ORD 25,000
Run Code Online (Sandbox Code Playgroud)
我在使用 pd.read_clipboard 重现上面的数据帧时遇到问题,所以这里是数据帧代码:
df = pd.DataFrame({'Origin': ['PVG', 'CAN, XMN'],
'Destination': ['AMS, FRA', 'LAX, ORD'],
'Weight': [10000, 25000]})
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
Origin Destination Weight
PVG AMS 10,000
PVG FRA 10,000
CAN LAX 25,000
CAN ORD 25,000
XMN LAX 25,000
XMN ORD 25,000
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用:
df['Origin'].str.split(',', expand = True)
Run Code Online (Sandbox Code Playgroud)
我曾尝试为起点和终点执行此操作,这适用于将字符串解析为单独的列。我正在努力将所有可能的组合创建到单独的行中(我尝试使用 pivot_table 并且没有运气而融化)。
我正在使用 pandas datareader 来提取给定日期范围内的股票信息。例如:
import pandas_datareader.data as web
import datetime as dt
start = dt.datetime(2018,3,26)
end = dt.datetime(2018,3,29)
web.DataReader('IBM','yahoo', start, end).reset_index()
Run Code Online (Sandbox Code Playgroud)
这将为 IBM 返回以下数据帧:
这包含我正在寻找的信息,但我想自动遍历多个股票代码(而不是手动更改股票代码)。理想情况下,我可以通过所需的股票行情列表循环此代码。
我有以下熊猫数据框 df:
Description Code
0 Apples 014
1 Oranges 015
2 Bananas 017
3 Grapes 021
Run Code Online (Sandbox Code Playgroud)
我需要将其转换为元组的元组,如下所示:
my_fruits = ( ('Apples', '014'),
('Oranges', '015'),
('Bananas', '017'),
('Grapes', '021')
)
Run Code Online (Sandbox Code Playgroud)
你能帮我吗?我已经尝试了以下代码,但没有返回我真正想要的:
list(zip(df.columns,df.T.values.tolist()))
Run Code Online (Sandbox Code Playgroud)
提前致谢!!!
我有一个数据帧(约100万行),其中包含一个列('Product'),其中包含'none','q1','q123'或'q12_a123'等字符串.
我想提取字母'q'后面的数字并将其输入另一列('AmountPaid'),以便它看起来如下所示:
'Product' 'AmountPaid'
none 0
q1 1
q123 123
q12_a123 12
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有:
for i in range(0,1000000):
if 'q' not in df.loc[i,'Product']:
df.loc[i,'AmountPaid']=0
else:
# set 'AmountPaid' to the number following 'q'
Run Code Online (Sandbox Code Playgroud)
问题:
所以我有一个超过500行的数据集,其中一列的值如下所示:
DF:
column1
0 a{'...'}
1 b{'...'}
2 c{'...'}
3 d{'...'}
Run Code Online (Sandbox Code Playgroud)
我想删除内部和内部的所有内容{}.
我一直在寻找这个问题,熊猫一个数据帧中指定的字符后,删除部分字符串,并试图解决方案有,但我不断收到错误(而据我所知,StringIO现在是io.StringIO).
我试过了
df.column1 = df.column1.str.split('{')[0]
Run Code Online (Sandbox Code Playgroud)
但得到错误信息:KeyError: 0 并不真正理解这意味着什么
我也尝试过:
df.column1 = df.column1.str.split(pat='{')
Run Code Online (Sandbox Code Playgroud)
但这似乎只删除了'{'所以我留下了
column1
0 a'...'}
1 b'...'}
2 c'...'}
3 d'...'}
Run Code Online (Sandbox Code Playgroud)
此外,我不确定它是否重要,但列是一种object类型.任何人都可以告诉我我做错了什么以及如何解决问题???
我有数百个 Excel 文件,我想创建一个 df,其中一列中包含 Excel 文件的名称,第二列中包含每个选项卡的名称。我的脚本将迭代每个文件名,但我附加的方式不正确,而且我没有太多运气找到解决方案。
os.chdir(r'C:\Users\mbobak\Documents\\')
FileList = glob.glob('*.xlsx')
tabs= pd.DataFrame(columns=['filename','tabs'])
for filename in FileList:
xl = pd.ExcelFile(filename).sheet_names
tabs= tabs.append([filename,xl])
Run Code Online (Sandbox Code Playgroud)
期望的输出:
filename tabs
doc1.xlsx tab1
doc1.xlsx tab2
doc1.xlsx tab3
doc1.xlsx tab4
doc2.xlsx tab1
doc2.xlsx tab2
doc2.xlsx tab3
Run Code Online (Sandbox Code Playgroud) 对于在 pandas 中创建的以下数据表,
Date Score Study_Date
02/2011 70 11/2012
03/2011 72 11/2012
10/2011 60 11/2012
12/2011 50 11/2012
01/2012 40 11/2012
02/2012 60 11/2012
03/2012 75 11/2012
11/2012 70 11/2012
12/2012 70 11/2012
01/2013 30 11/2012
02/2013 20 11/2012
04/2013 60 11/2012
06/2013 80 11/2012
Run Code Online (Sandbox Code Playgroud)
我想将日期早于研究日期的行的所有分数替换为 0。
我尝试了以下方法:
df[df.Date < df.Study_Date, 'Score']=0
Run Code Online (Sandbox Code Playgroud)
但我得到:
类型错误:“系列”对象是可变的,因此它们不能被散列
任何帮助将不胜感激。
我有下一个问题。
例如我在 Pandas 中有下一个 DataFrame
a b c
'x' 1 100
'y' 2 100
'z' 3 100
Run Code Online (Sandbox Code Playgroud)
现在我想根据列中的值创建a新 DataFrame 的标题,列中的值是我用于索引的b第一行和第一列中的对应值。c目前我使用下一个代码:
import pandas
piv = df.pivot(index='c', columns='a')
new_df = pandas.DataFrame(piv.to_records())
Run Code Online (Sandbox Code Playgroud)
输出对我来说不够合适,因为我有b一个新 DataFrame 的列名称。也许有人可以在这里告诉我一个更好的解决方案来准确获得下一个输出:
index 'x' 'y' 'z'
100 1 2 3
Run Code Online (Sandbox Code Playgroud)
不应该是一个数据透视表,而只是一个真正的DataFrame。