我一直在使用python,pandas和seaborn来获得具有不同colormaps/columns的热图.感谢这个问题,我做了以下事情:
示例Dataframe(sample.csv):
X,a,b,c
A,0.5,0.7,0.4
B,0.9,0.3,0.8
C,0.3,0.4,0.7
Run Code Online (Sandbox Code Playgroud)
使用Seaborn绘制热图
import pandas as pd
import matplotlib as mpl
# Set new Backend to Use Seaborn
# mpl.use('Agg')
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import colorsys
# Working example data:
df = pd.DataFrame([[0.5,0.7,0.4],[.9,.3,.8],[.3,.4,.7]],['A','B','C'])
# Get Color List
N = 3
COL = [colorsys.hsv_to_rgb(x*1.0/N, 0.7, 0.5) for x in range(N)]
with sns.axes_style('white'):
for i, name in enumerate(df.columns):
# Create cmap
colors = COL[i]
cmap = sns.light_palette(colors, …Run Code Online (Sandbox Code Playgroud) 从这个数据帧df开始:
df = pd.DataFrame({'c':[1,1,1,2,2,2],'l1':['a','a','b','c','c','b'],'l2':['b','d','d','f','e','f']})
c l1 l2
0 1 a b
1 1 a d
2 1 b d
3 2 c f
4 2 c e
5 2 b f
Run Code Online (Sandbox Code Playgroud)
我想在c列上执行groupby 以获取l1和l2列的唯一值.对于我可以做的一列:
g = df.groupby('c')['l1'].unique()
Run Code Online (Sandbox Code Playgroud)
正确返回:
c
1 [a, b]
2 [c, b]
Name: l1, dtype: object
Run Code Online (Sandbox Code Playgroud)
但使用:
g = df.groupby('c')['l1','l2'].unique()
Run Code Online (Sandbox Code Playgroud)
收益:
AttributeError: 'DataFrameGroupBy' object has no attribute 'unique'
Run Code Online (Sandbox Code Playgroud)
我知道我可以用(以及其他)获得两列的唯一值:
In [12]: np.unique(df[['l1','l2']])
Out[12]: array(['a', 'b', 'c', 'd', 'e', 'f'], dtype=object)
Run Code Online (Sandbox Code Playgroud)
有没有办法将此方法应用于groupby,以获得类似的东西:
c …Run Code Online (Sandbox Code Playgroud) 我有一个pandas数据帧,如:
df = pd.read_csv('fruit.csv')
print(df)
fruitname quant
0 apple 10
1 apple 11
2 apple 13
3 banana 10
4 banana 20
5 banana 30
6 banana 40
7 pear 10
8 pear 102
9 pear 1033
10 pear 1012
11 pear 101
12 pear 100
13 pear 1044
14 orange 10
Run Code Online (Sandbox Code Playgroud)
我想删除最后一个条目PER FRUIT,如果该水果有一个奇数(不均匀)条目数(%2 == 1).没有循环数据帧.所以上面的最终结果是:
- 删除最后一个苹果,因为苹果发生3次 - 去除最后一个梨 - 删除最后一个(仅)橙色
导致:
fruitname quant
0 apple 10
1 apple 11
2 banana 10
3 banana 20
4 banana 30 …Run Code Online (Sandbox Code Playgroud) 我有这个数据帧df:
U,Datetime
01,2015-01-01 20:00:00
01,2015-02-01 20:05:00
01,2015-04-01 21:00:00
01,2015-05-01 22:00:00
01,2015-07-01 22:05:00
02,2015-08-01 20:00:00
02,2015-09-01 21:00:00
02,2014-01-01 23:00:00
02,2014-02-01 22:05:00
02,2015-01-01 20:00:00
02,2014-03-01 21:00:00
03,2015-10-01 20:00:00
03,2015-11-01 21:00:00
03,2015-12-01 23:00:00
03,2015-01-01 22:05:00
03,2015-02-01 20:00:00
03,2015-05-01 21:00:00
03,2014-01-01 20:00:00
03,2014-02-01 21:00:00
Run Code Online (Sandbox Code Playgroud)
通过由U与一个Datetime对象.我想做的是过滤U几个月/年至少连续三次出现的值.到目前为止,我已经通过分组U,year并month为:
m = df.groupby(['U',df.index.year,df.index.month]).size()
Run Code Online (Sandbox Code Playgroud)
获得:
U
1 2015 1 1
2 1
4 1
5 1
7 1
2 2014 1 1
2 1
3 1 …Run Code Online (Sandbox Code Playgroud) 从示例数据框开始,df如:
a,b
0,0.71
1,0.75
2,0.80
3,0.90
Run Code Online (Sandbox Code Playgroud)
我会添加一个具有指数值列的新列b.到目前为止我试过:
df['exp'] = math.exp(df['b'])
Run Code Online (Sandbox Code Playgroud)
但是这个方法返回:
"cannot convert the series to {0}".format(str(converter)"
TypeError: cannot convert the series to <type 'float'>
Run Code Online (Sandbox Code Playgroud)
有没有办法将math函数应用于整个列?
假设我有一个多索引的pandas数据框,看起来像下面这个,取自文档.
import numpy as np
import pandas as pd
arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
0 1 2 3
bar one -0.096648 -0.080298 0.859359 -0.030288
two 0.043107 -0.431791 1.923893 -1.544845
baz one 0.639951 -0.008833 -0.227000 0.042315
two 0.705281 0.446257 -1.108522 0.471676
foo one -0.579483 -2.261138 -0.826789 1.543524
two -0.358526 1.416211 1.589617 0.284130
qux one 0.498149 -0.296404 0.127512 -0.224526
two -0.286687 …Run Code Online (Sandbox Code Playgroud) 我试图在pandas数据帧中绘制数据,使用索引(日期和时间)作为x轴,数据帧中的其余数据作为实际数据.这是我现在正在尝试的内容:
from matplotlib.finance import candlestick2
bars[['open','high','low','close']].head()
tickdatetime open high low close
2012-09-20 09:00:00 1447.50 1447.50 1447.00 1447.00
2012-09-20 09:01:00 1447.00 1447.25 1447.00 1447.25
2012-09-20 09:02:00 1447.25 1447.75 1447.25 1447.50
2012-09-20 09:03:00 1447.75 1447.75 1447.25 1447.50
2012-09-20 09:04:00 1447.25 1447.50 1447.25 1447.50
fig,ax = plt.subplots()
ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
fig,ax = plt.subplots()
ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
ax = fig.add_axes([0.1, 0.2, 0.85, 0.7])
ax.autoscale_view()
linecol, rectcol = candlestick2(ax,bars['open'],bars['close'],bars['high'],bars['low'],width=.5,colorup='g',colordown''r',alpha=1)
z = rectcol.get_zorder()
linecol.set_zorder(0.9*z)
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
AttributeError Traceback (most recent call last)
<ipython-input-57-d62385067ceb> in <module>()
1 fig,ax …Run Code Online (Sandbox Code Playgroud) 我有一个大 (8 GB) csv gzip 文件。我想通过 pandas 将其读入 DataFrame 中。由于文件的长度很大,所以我分块读取它并且工作正常,但我有兴趣知道是否有办法只读取最后 x 行,而不解压缩整个文件。
我正在阅读一个加权 egdelist / numpy 数组,如:
0 1 1
0 2 1
1 2 1
1 0 1
2 1 4
Run Code Online (Sandbox Code Playgroud)
其中列是“User1”、“User2”、“Weight”。我想用 执行 DFS 算法scipy.sparse.csgraph.depth_first_tree,它需要一个 N x N 矩阵作为输入。如何将上一个列表转换为方阵:
0 1 1
1 0 1
0 4 0
Run Code Online (Sandbox Code Playgroud)
在 numpy 或 scipy 中?
谢谢你的帮助。
编辑:
我一直在使用一个巨大的(1.5 亿个节点)网络,所以我正在寻找一种内存高效的方法来做到这一点。
我正在运行Pandas 0.16.2和Matplotlib 1.4.3.我有这个问题着色由以下代码生成的boxplot的中位数:
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
fig, ax = plt.subplots()
medianprops = dict(linestyle='-', linewidth=2, color='blue')
bp = df.boxplot(medianprops=medianprops)
plt.show()
Run Code Online (Sandbox Code Playgroud)
返回:
看来该color设置未被读取.仅更改线条样式和线宽的设置,图表会正确反应.
medianprops = dict(linestyle='-.', linewidth=5, color='blue')
Run Code Online (Sandbox Code Playgroud)
任何人都可以重现它吗?
pandas ×9
python ×9
matplotlib ×3
dataframe ×2
csv ×1
heatmap ×1
numpy ×1
scipy ×1
seaborn ×1
time-series ×1