小编iay*_*ork的帖子

Matplotlib:避免在"散点/点/ beeswarm"图中重叠数据点

使用matplotlib绘制点图时,我想偏移重叠的数据点以使它们全部可见.例如,如果我有

CategoryA: 0,0,3,0,5  
CategoryB: 5,10,5,5,10  
Run Code Online (Sandbox Code Playgroud)

我希望每个CategoryA"0"数据点并排设置,而不是彼此重叠,同时仍然保持不同CategoryB.

在R(ggplot2)中有一个"jitter"选项可以做到这一点.在matplotlib中是否有类似的选项,还是有另一种方法可以导致类似的结果?

编辑:为了澄清, R中"beeswarm"情节基本上是我的想法,并且pybeeswarm是matplotlib/Python版本的早期但有用的开始.

编辑:添加版本0.7中引入的Seaborn的 Swarmplot,是我想要的一个很好的实现.

python charts matplotlib

38
推荐指数
7
解决办法
3万
查看次数

熊猫:用合并的单元格读取Excel

我有多个工作表的Excel文件,每个工作表看起来都像这样(但更长):

        Sample  CD4     CD8
Day 1   8311    17.3    6.44
        8312    13.6    3.50
        8321    19.8    5.88
        8322    13.5    4.09
Day 2   8311    16.0    4.92
        8312    5.67    2.28
        8321    13.0    4.34
        8322    10.6    1.95
Run Code Online (Sandbox Code Playgroud)

第一列实际上是垂直合并的四个单元格.

当我使用pandas.read_excel读取它时,我得到一个如下所示的DataFrame:

       Sample    CD4   CD8
Day 1    8311  17.30  6.44
NaN      8312  13.60  3.50
NaN      8321  19.80  5.88
NaN      8322  13.50  4.09
Day 2    8311  16.00  4.92
NaN      8312   5.67  2.28
NaN      8321  13.00  4.34
NaN      8322  10.60  1.95
Run Code Online (Sandbox Code Playgroud)

我怎样才能让Pandas了解合并的单元格,或者通过适当的值快速轻松地删除NaN和组?(一种方法是重置索引,逐步查找值并用值替换NaN,传入日期列表,然后将索引设置为列.但似乎应该有一个更简单的方法.)

python excel pandas

22
推荐指数
3
解决办法
2万
查看次数

Seaborn调色板 - 防止颜色的再循环

Seaborn允许定义包含多种颜色的调色板,对于包含多行的图表非常有用.但是,当将调色板设置为具有多种颜色的调色板时,仅使用前六种颜色,之后颜色会再循环,从而难以区分线条.这可以通过显式调用调色板来覆盖,但这不方便.当定义超过6个时,有没有办法强制Seaborn当前调色板不回收颜色?

例:

from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sb

# Define a palette with 8 colors
cmap = sb.blend_palette(["firebrick", "palegreen"], 8) 
sb.palplot(cmap)
Run Code Online (Sandbox Code Playgroud)

6种颜色的调色板

# Set the current palette to this; only 6 colors are used
sb.set_palette(cmap)
sb.palplot(sb.color_palette() )
Run Code Online (Sandbox Code Playgroud)

6种颜色的调色板

df = pd.DataFrame({x:[x*10, x*10+5, x*10+10] for x in range(8)})
fig, (ax1, ax2) = plt.subplots(2,1,figsize=(4,6))
# Using the current palette, colors repeat 
df.plot(ax=ax1) 
ax1.legend(bbox_to_anchor=(1.2, 1)) 
# using the palette that defined the current palette, colors don't repeat …
Run Code Online (Sandbox Code Playgroud)

python matplotlib pandas seaborn

14
推荐指数
1
解决办法
6566
查看次数

HTML表到pandas表:html标签内的信息

我有一个来自网络的大表,通过请求访问并使用BeautifulSoup解析.部分内容如下所示:

<table>
<tbody>
<tr>
<td>265</td>
<td> <a href="/j/jones03.shtml">Jones</a>Blue</td>
<td>29</td>
</tr>
<tr >
<td>266</td>
<td> <a href="/s/smith01.shtml">Smith</a></td>
<td>34</td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

当我使用pd.read_html(tbl)输出将其转换为pandas时是这样的:

    0    1          2
 0  265  JonesBlue  29
 1  266  Smith      34
Run Code Online (Sandbox Code Playgroud)

我需要将信息保留在<A HREF ... >标记中,因为唯一标识符存储在链接中.也就是说,该表应如下所示:

    0    1        2
 0  265  jones03  29
 1  266  smith01  34
Run Code Online (Sandbox Code Playgroud)

我对各种其他输出都很好(例如,jones03 Jones会更有帮助),但唯一ID是至关重要的.

其他单元格中也有html标签,一般情况下我不希望保存这些标签,但如果这是获取uid的唯一方法我可以保留这些标签并在以后清理它们,如果我必须.

有没有一种简单的方法来访问这些信息?

python beautifulsoup pandas

8
推荐指数
2
解决办法
1万
查看次数

用转置版填充矩阵

我有一个成对矩阵:

>>> m
     a    b    c   d
a  1.0  NaN  NaN NaN
b  0.5  1.0  NaN NaN
c  0.6  0.0  1.0 NaN
d  0.5  0.4  0.3 1.0
Run Code Online (Sandbox Code Playgroud)

我想用右下角的值替换右上角的NaN:

>>> m2
     a    b    c    d
a  1.0  0.5  0.6  0.5
b  0.5  1.0  0.0  0.4
c  0.6  0.0  1.0  0.3
d  0.5  0.4  0.3  1.0
Run Code Online (Sandbox Code Playgroud)

我可以通过交换列和索引来做到这一点:

cols = m.columns
idxs = m.index

for c in cols:
    for i in idxs:
        m[i][c] = m[c][i]
Run Code Online (Sandbox Code Playgroud)

但是我的实际数据很慢,而且我确信有一种方法可以一步到位.我知道我可以使用"mT"生成右上角版本,但我不知道如何用非NaN值替换NaN以获得完整的矩阵.在numpy中可能只有一步到位的方法,但我不知道矩阵代数.

python numpy matrix dataframe pandas

6
推荐指数
1
解决办法
131
查看次数

平滑二维图形

我有一些需要平滑的模糊矩形2D图形.一个简化的例子:

fig, ax1 = plt.subplots(1,1, figsize=(3,3))
xs1 = [-0.25,  -0.625, -0.125, -1.25, -1.125, -1.25, 0.875, 1.0, 1.0, 0.5, 1.0, 0.625, -0.25]
ys1 = [1.25, 1.375, 1.5, 1.625, 1.75, 1.875, 1.875, 1.75, 1.625, 1.5, 1.375, 1.25, 1.25]

ax1.plot(xs1, ys1)
ax1.set_ylim(0.5,2.5)
ax1.set_xlim(-2,2) ;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述

我已经尝试了scipy.interpolate.RectBivariateSpline,但显然需要所有点的数据(例如热图)和scipy.interpolate.interp1d但是,合理地说,想要生成1d平滑版本.

什么是平滑这个的适当方法?

编辑以更好地修改/解释我的目标.我不需要线条来完成所有要点; 事实上,我更喜欢他们没有经历所有要点,因为有明确的异常点,"应该"与邻居平均,或类似的方法.我已经包含了一个粗略的手册草图,上面是我的想法.

python interpolation smooth matplotlib

6
推荐指数
2
解决办法
3062
查看次数

python pandas dataframe head()什么都不显示

我是新手使用熊猫,我只是不知道该怎么做:

我正在使用python.我(正确)安装了anaconda.在我的文件中,我只是创建一个DataFrame(首先从read_csv导入它,然后手动重新创建它以确保不是问题).当我打印(数据帧)时,它打印:

        km |  price
0  | 240000 |  3650

[...]

23  | 61789 |  8290
Run Code Online (Sandbox Code Playgroud)

当我做dataframe.info()时我得到了这个:

class 'pandas.core.frame.DataFrame'

Int64Index: 24 entries, 0 to 23

Data columns (total 2 columns):

km       24 non-null int64

price    24 non-null int64

dtypes: int64(2)

memory usage: 576.0 bytes
Run Code Online (Sandbox Code Playgroud)

哪个是完美的.但我尝试的任何其他简单功能只显示NOTHING.我尝试了dataframe.head(),dataframe ['km'],dataframe [3:6]等.没有错误,我的终端上只有一大碗什么都没有.

编辑以添加示例代码:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
pd.set_option('max_columns', 50) 
#df=pd.read_csv('data.csv') 
data = {'km': [240000, 139800, 150500, 185530, 176000, 114800, 166800, 89000, 144500, 84000, 82029, 63060, 74000, 97500, …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas anaconda

6
推荐指数
2
解决办法
2万
查看次数

Seaborn KDEPlot - 数据变化不够?

我有一个包含 ~900 行的数据框;我正在尝试为某些列绘制 KDEplots。在某些列中,大多数值是相同的最小值。当我包含太多最小值时,KDEPlot 会突然停止显示最小值。例如,以下包括 600 个值,其中 450 个是最小值,并且绘图看起来不错:

y = df.sort_values(by='col1', ascending=False)['col1'].values[:600]
sb.kdeplot(y)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

但是包括 451 个最小值给出了非常不同的输出:

y = df.sort_values(by='col1', ascending=False)['col1'].values[:601]
sb.kdeplot(y)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

最终,我想绘制不同列的双变量 KDEPlots,但我想先了解这一点。

python kernel-density seaborn

4
推荐指数
1
解决办法
682
查看次数

来自pandas数据帧的成对矩阵

我有一个像这样的pandas数据框:

__PRE__

有大约一千行和六十列.大多数细胞是空的(NaN).我想知道每列中文本的概率是多少,因为不同的列中有文本.例如,这里的小片段会产生如下内容:

__PRE__

这表明Al01柱中有4个命中; 在这两个命中中,没有一个是BBR60列中的命中,2个也是CA07列中的命中,3个是NL219列中的命中.等等.

我可以单步执行每一列并使用值构建一个dict,但这看起来很笨拙.有更简单的方法吗?

python pandas

3
推荐指数
1
解决办法
2129
查看次数

Seaborn:如何在圆图上绘制风速v方向?

如果我的熊猫df看起来像这样(仅更长),请使用Seaborn 0.6.0:

windSpeed  windBearing
15.37          165
17.49          161
16.41          154
15.54          164
17.38          162
17.80            0
17.36          181
17.35          181
15.96          175
15.86          157 
Run Code Online (Sandbox Code Playgroud)

如何将windBearing绘制为圆形网格,将罗盘方向和windSpeed表示为从中心发出的光线,其速度由射线的长度表示?

python plot matplotlib

3
推荐指数
1
解决办法
2090
查看次数

通过 Pandas 计算每一行与共识的差异

我有一个如下所示的数据框:

import pandas as pd
df = pd.DataFrame({'A':['a','b','c','d'],'B':['a','b','c','x'],'C':['y','b','c','d']})
df

   A  B  C
0  a  a  y
1  b  b  b
2  c  c  c
3  d  x  d
Run Code Online (Sandbox Code Playgroud)

我想识别每行中最常见的字符,并计算与共识的差异总数:

       A  B  C Consensus
    0  a  a  y         a
    1  b  b  b         b
    2  c  c  c         c
    3  d  x  d         d
Total  0  1  1         0
Run Code Online (Sandbox Code Playgroud)

运行循环是一种方法,但似乎效率低下:

consensus = []
for idx in df.index:
    consensus.append(df.loc[idx].value_counts().index[0])
df['Consensus'] = consensus
Run Code Online (Sandbox Code Playgroud)

(等等)

有没有一种直接的方法来获得共识并从中计算差异?

python dataframe consensus pandas

3
推荐指数
1
解决办法
242
查看次数