在数据帧上使用转置后,总是有一个额外的行作为初始数据帧索引的余数,例如:
import pandas as pd
df = pd.DataFrame({'fruit':['apple','banana'],'number':[3,5]})
df
fruit number
0 apple 3
1 banana 5
df.transpose()
0 1
fruit apple banana
number 3 5
Run Code Online (Sandbox Code Playgroud)
即使我没有索引:
df.reset_index(drop = True, inplace = True)
df
fruit number
0 apple 3
1 banana 5
df.transpose()
0 1
fruit apple banana
number 3 5
Run Code Online (Sandbox Code Playgroud)
问题是当我将数据帧保存到csv文件时:
df.to_csv(f)
Run Code Online (Sandbox Code Playgroud)
这个额外的行保持在顶部,我每次都必须手动删除它.
这也行不通:
df.to_csv(f, index = None)
Run Code Online (Sandbox Code Playgroud)
因为旧索引不再被视为索引(只是另一行......).
它也发生在我换向相反的方式,我有一个额外的列,我无法删除.
有小费吗?
我试图用两种不同的方法在Pandas数据框中选择多个列:
1)通过列号,例如,列1-3和列6以后.
和
2)通过列名列表,例如:
years = list(range(2000,2017))
months = list(range(1,13))
years_month = list(["A", "B", "B"])
for y in years:
for m in months:
y_m = str(y) + "-" + str(m)
years_month.append(y_m)
Run Code Online (Sandbox Code Playgroud)
然后,years_month将产生以下内容:
['A',
'B',
'C',
'2000-1',
'2000-2',
'2000-3',
'2000-4',
'2000-5',
'2000-6',
'2000-7',
'2000-8',
'2000-9',
'2000-10',
'2000-11',
'2000-12',
'2001-1',
'2001-2',
'2001-3',
'2001-4',
'2001-5',
'2001-6',
'2001-7',
'2001-8',
'2001-9',
'2001-10',
'2001-11',
'2001-12']
Run Code Online (Sandbox Code Playgroud)
也就是说,在这两种方法中,只加载名称在列表years_month中的列的最佳(或正确)方法是什么?
我有一个大 Pandas 数据框:
Time P T R H
00000.0 1004.6 12.2 96 12
00001.0 1004.2 12.1 96 15
00002.0 1003.5 11.9 96 21
00003.0 1002.8 12.0 96 27
00004.0 1002.0 12.1 96 34
00005.0 1001.4 12.1 96 39
00006.0 1000.3 12.2 96 48
00007.0 999.5 12.1 96 55
00008.0 998.9 12.2 96 59
00009.0 998.0 12.1 96 67
00010.0 997.3 13.1 96 73
00011.0 996.9 13.2 97 76
00013.0 995.3 13.3 97 90
00014.0 994.6 13.6 97 96
00015.0 994.3 …
Run Code Online (Sandbox Code Playgroud) 如何通过按某些字段(在“国家”和“行业”示例中)分组并将数学应用到另一个字段(在“字段”和“值”示例中)来从现有DataFrame创建新行?
源数据帧
df = pd.DataFrame({'Country': ['USA','USA','USA','USA','USA','USA','Canada','Canada'],
'Industry': ['Finance', 'Finance', 'Retail',
'Retail', 'Energy', 'Energy',
'Retail', 'Retail'],
'Field': ['Import', 'Export','Import',
'Export','Import', 'Export',
'Import', 'Export'],
'Value': [100, 50, 80, 10, 20, 5, 30, 10]})
Country Industry Field Value
0 USA Finance Import 100
1 USA Finance Export 50
2 USA Retail Import 80
3 USA Retail Export 10
4 USA Energy Import 20
5 USA Energy Export 5
6 Canada Retail Import 30
7 Canada Retail Export 10
Run Code Online (Sandbox Code Playgroud)
目标数据框
净额=进口-出口
Country Industry Field …
Run Code Online (Sandbox Code Playgroud) 这是我在pycon参加Wesley教程后第一次尝试使用Pandas库.
在对数据框进行了一些讨论后,我很高兴能够以我想要的方式按下数据,但是在绘制数据时遇到了麻烦.我想这也表明了我对matplotlib库的天真.
我所拥有的是pandas Series对象,包含以下数据.我想绘制一个带有col 1('file')的条形图作为垂直方向的标签.
sample data here:
http://pastebin.com/y2w0uJPQ
Run Code Online (Sandbox Code Playgroud) 是否有矢量化操作来计算 Python DataFrame 的累积和滚动标准偏差 (SD)?
例如,我想添加一个列 'c',它根据列 'a' 计算累积 SD,即在索引 0 中,由于 1 个数据点,它显示 NaN,在索引 1 中,它根据 2 个数据计算 SD积分等等。
同样的问题也适用于滚动 SD。有没有一种有效的方法来计算而不通过 df.itertuples() 进行迭代?
import numpy as np
import pandas as pd
def main():
np.random.seed(123)
df = pd.DataFrame(np.random.randn(10, 2), columns=['a', 'b'])
print(df)
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud) #更新:pandas 版本 0.23.0 解决了这个问题
我一直在努力解决这个问题,我怀疑有更好的方法。如何按索引级别名称“idx_0”、level=0 和按列“value_1”降序对以下数据帧进行排序,以便列“MyName”读取垂直“SCOTTBOSTON”。
import pandas as pd
import numpy as np
df = pd.DataFrame({'idx_0':[2]*6+[1]*5,
'idx_1':[6,4,2,10,18,5,11,1,7,9,3],
'value_1':np.arange(11,0,-1),
'MyName':list('BOSTONSCOTT')})
df = df.set_index(['idx_0','idx_1'])
df
Run Code Online (Sandbox Code Playgroud)
输出:
MyName value_1
idx_0 idx_1
2 6 B 11
4 O 10
2 S 9
10 T 8
18 O 7
5 N 6
1 11 S 5
1 C 4
7 O 3
9 T 2
3 T 1
Run Code Online (Sandbox Code Playgroud)
#例外输出使用:
df.sort_values(['value_1'], ascending=False)\
.reindex(sorted(df.index.get_level_values(0).unique()), level=0)
Run Code Online (Sandbox Code Playgroud)
我怀疑有一种更简单的方法,无需重置索引
MyName value_1
idx_0 idx_1
1 11 S 5
1 …
Run Code Online (Sandbox Code Playgroud) 我有一个名为输出的数据框,如下所示:
created_at
0 1/8/2017 0:00
1 1/8/2017 0:00
2 1/8/2017 0:00
3 1/8/2017 0:00
4 1/8/2017 0:00
5 1/8/2017 1:00
6 1/8/2017 2:00
7 1/8/2017 3:00
Run Code Online (Sandbox Code Playgroud)
我想计算特定时间在名为df3的数据框中出现的次数。结果如下:
1/8/2017 0:00 5
1/8/2017 1:00 1
1/8/2017 3:00 1
1/8/2017 2:00 1
Run Code Online (Sandbox Code Playgroud)
我想要的是将两个标题添加到 df3 中,称为created_at和count。
我首先做的是从输出数据框中删除重复项并对值进行排序,得到如下结果:
created_at
0 1/8/2017 0:00
5 1/8/2017 1:00
6 1/8/2017 2:00
7 1/8/2017 3:00
Run Code Online (Sandbox Code Playgroud)
现在我在输出数据框中添加了列数,但得到的结果如下:
created_at count
0 1/8/2017 0:00 NaN
5 1/8/2017 1:00 NaN
6 …
Run Code Online (Sandbox Code Playgroud) 我有两个不同大小的数据框。仅当第二个数据帧的值小于第一个数据帧的值时,我才想用第二个数据帧的值替换第一个数据帧的值。换句话说,我想找到每个位置的两个数据帧的最小值,以匹配两个数据帧的索引。
df1:
A B C
0 0 12 7
1 15 20 0
2 7 0 3
Run Code Online (Sandbox Code Playgroud)
df2:
A B C
1 4 25 8
2 0 0 5
Run Code Online (Sandbox Code Playgroud)
结果 df:
A B C
0 0 12 7
1 4 20 0
2 0 0 3
Run Code Online (Sandbox Code Playgroud) 这可能是一个错误,但是您对此 pandas 功能有何看法:
df = pd.DataFrame(np.arange(20).reshape(10,-1), columns=[*'AB'])
def f(x):
print(type(x))
df.agg(f)
Run Code Online (Sandbox Code Playgroud)
输出:
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
A None
B None
dtype: object
Run Code Online (Sandbox Code Playgroud)
但是,如果我将 agg 方法中的函数调用包装在括号中,将单个函数作为列表传递。
df = pd.DataFrame(np.arange(20).reshape(10,-1), columns=[*'AB'])
def f(x):
print(type(x))
df.agg([f])
Run Code Online (Sandbox Code Playgroud)
输出:
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
A B
f f
0 None …
Run Code Online (Sandbox Code Playgroud)