小编max*_*max的帖子

根据 Pandas 中的 groupby 获取百分比?

我有一个像这样的熊猫数据帧:

subject bool Count
1   False   329232  
1   True    73896   
2   False   268338  
2   True    76424   
3   False   186167  
3   True    27078   
4   False   172417  
4   True    113268  
Run Code Online (Sandbox Code Playgroud)

我想Count变成每个科目组的百分比。例如,第 1 行是329232 / (329232 + 73896) = 0.816,第 2 行是73896/ (329232 + 73896) = 0.183。然后,第 2 组的总数将发生变化,依此类推。

这可以通过 groupby 来完成吗?我尝试遍历行但收效甚微。

python pandas

5
推荐指数
1
解决办法
1446
查看次数

使用 Seaborn 中的值标记水平条形图

我有一个水平条形图,例如,seaborn 文档中示例的简化版本:https ://seaborn.pydata.org/examples/horizo​​ntal_barplot.html

import seaborn as sns
import matplotlib.pyplot as plt

f, ax = plt.subplots(figsize=(6, 15))

crashes = sns.load_dataset("car_crashes").sort_values("total", ascending=False)

sns.barplot(x="total", y="abbrev", data=crashes,
            label="Total", color="b")

ax.set(xlim=(0, 24), ylabel="",
       xlabel="Automobile collisions per billion miles")


plt.show()
Run Code Online (Sandbox Code Playgroud)

如何获得标有每个条形值的条形?

我为垂直条尝试了这种方法(如何在 seaborn 的条上添加百分比?),但它似乎不起作用。将高度更改为宽度不会产生我认为的效果。

for p in ax.patches:
    height = p.get_width()
    ax.text(p.get_y()+p.get_height()/2.,
            height + 3,
            '{:1.2f}'.format(height),
            ha="center")
Run Code Online (Sandbox Code Playgroud)

我假设水平图的工作方式不同?

python matplotlib seaborn

4
推荐指数
2
解决办法
6491
查看次数

通过删除异常值对熊猫分组

我想按组删除基于百分位 99 值的异常值。

 import pandas as pd
 df = pd.DataFrame({'Group': ['A','A','A','B','B','B','B'], 'count': [1.1,11.2,1.1,3.3,3.40,3.3,100.0]})
Run Code Online (Sandbox Code Playgroud)

在输出中,我想从 A 组中删除 11.2,从 b 组中删除 100。所以在最终数据集中只有 5 个观察值。

wantdf = pd.DataFrame({'Group': ['A','A','B','B','B'], 'count': [1.1,1.1,3.3,3.40,3.3]})
Run Code Online (Sandbox Code Playgroud)

我试过这个,但我没有得到想要的结果

df[df.groupby("Group")['count'].transform(lambda x : (x<x.quantile(0.99))&(x>(x.quantile(0.01)))).eq(1)]
Run Code Online (Sandbox Code Playgroud)

python python-3.x pandas pandas-groupby

4
推荐指数
2
解决办法
4193
查看次数

结合文字和数据图表与方面?

我正在处理本示例中的代码,并对其进行了一些修改:

https://altair-viz.github.io/gallery/layered_heatmap_text.html

我试图弄清楚为什么当我尝试进入列时我的代码会中断。

# Import data
import altair as alt
from vega_datasets import data

source = data.cars()

# Configure common options
base = alt.Chart(source)
scale = alt.Scale(paddingInner=0)
Run Code Online (Sandbox Code Playgroud)

原始版本运行良好:

# Configure heatmap
heatmap = base.mark_rect().encode(
    alt.X('Cylinders:O', scale=scale),
    alt.Y('Year:O', scale=scale),
    color='count()'
)

# Configure text
text = base.mark_text(baseline='middle').encode(
    x='Cylinders:O',
    y='Year:O',
    text='count()',
    color=alt.value('white')
)

# Draw the chart
heatmap+text
Run Code Online (Sandbox Code Playgroud)

现在我想谈谈Origin。分别显示heatmaptext单独显示时,下面的代码有效,但是当我将它们组合使用时,会出现错误。

# Configure heatmap
heatmap = base.mark_rect().encode(
    alt.X('Cylinders:O', scale=scale),
    alt.Y('Year:O', scale=scale),
    color='count()',
    column = 'Origin'
)

# Configure …
Run Code Online (Sandbox Code Playgroud)

python altair

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

使用 dplyr 的每组前“n”行——每组具有不同的数量

我将使用内置chickwts数据作为示例。

这是数据,有 5 种提要类型。

> head(chickwts)

  weight      feed
1    179 horsebean
2    160 horsebean
3    136 horsebean
4    227 horsebean
5    217 horsebean
6    168 horsebean

> table(chickwts$feed)

   casein horsebean   linseed  meatmeal   soybean sunflower 
       12        10        12        11        14        12 
Run Code Online (Sandbox Code Playgroud)

我想要的是每种饲料类型按重量计算的前几行。但是,对于每种 Feed 类型我都需要不同的编号吗?例如,

top_n_feed <-
  c(
    "casein" = 3,
    "horsebean" = 5,
    "linseed" = 3,
    "meatmeal" = 6,
    "soybean" = 3,
    "sunflower" = 2
  )
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点dplyr

要按n重量获得每种提要类型的顶行,我可以使用如下代码,但我不确定如何将其扩展到每种提要类型的不同数字。

chickwts %>%
  group_by(feed) %>% 
  slice_max(order_by = weight, …
Run Code Online (Sandbox Code Playgroud)

r dplyr data-cleaning data-wrangling

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

将数据框按行转换为列表列表?

假设我有一个数据框:

df <- tibble(x=c(1,2,3),
             y=c(4,5,6),
             z=c(7,8,9))
Run Code Online (Sandbox Code Playgroud)
# A tibble: 3 x 3
      x     y     z
  <dbl> <dbl> <dbl>
1     1     4     7
2     2     5     8
3     3     6     9
Run Code Online (Sandbox Code Playgroud)

如何将数据框转换为列表列表,其中每个列表都对有关每一行的信息进行编码,如下所示:

list(list(x=1, y=4, z=7),
     list(x=2, y=5, z=8),
     list(x=3, y=6, z=9))
Run Code Online (Sandbox Code Playgroud)

注意:我在下面的回答中对迄今为止介绍的所有方法进行了基准测试。

r dataframe

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

使用 Seaborn 条形图绘制熊猫分类系列

我想用 绘制values_counts()方法的结果seaborn,但是当我这样做时,它只显示其中一个变量。

df = pd.DataFrame({"A":['b','b','a','c','c','c'],"B":['a','a','a','c','b','d']})
counts = df.A.value_counts()
sns.barplot(counts)
Run Code Online (Sandbox Code Playgroud)

上面代码的结果

我想要一个显示高度的条形图 'a' = 1, 'b' = 2, 'c' = 3

我试图重新命名指数和传递xy参数,但我不能”得到它的工作。

python pandas seaborn

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

更好的方法来测试多个成员资格?

我的代码在这里很糟糕,是否有改进它的pythonic方法?

我有三套:

set1 = {1,2,3}
set2 = {2,3,4}
set3 = {4,5,6}
Run Code Online (Sandbox Code Playgroud)

和一个组合集

combined = set1 | set2 | set3
Run Code Online (Sandbox Code Playgroud)

我需要一个dict来返回是否每个都设置了一个数字.

例如

d[2] = {'set1':True, 'set2':True, 'set3':False}
Run Code Online (Sandbox Code Playgroud)

我的代码是这样的:

def in_set(num):
    d = {}
    if num in set1:
        d['set1'] = True
    else:
        d['set1'] = False

    if num in set2:
        d['set2'] = True
    else:
        d['set2'] = False

    if num in set3:
        d['set3'] = True
    else:
        d['set3'] = False

    return d
Run Code Online (Sandbox Code Playgroud)

python

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

使用 tidyverse 以整洁的格式映射列

我经常使用如下所示的模式,我将数据存储在tibbleusing 列表列中,使用 将函数应用于数据purrr::map,然后使用pivot_longer转换为整洁格式(长)。

是否有一种更清洁/更惯用的方法可以一步完成此操作,而不必每次都对数据进行透视?

library(tidyverse)

df <- tibble(n = 5:10)

df$data <- map(df$n, ~rnorm(.x))
df$mean <- map_dbl(df$data, ~mean(.x))
df$median <- map_dbl(df$data, ~median(.x))
Run Code Online (Sandbox Code Playgroud)
# A tibble: 6 x 4
      n data          mean  median
  <int> <list>       <dbl>   <dbl>
1     5 <dbl [5]>  -0.0239 -0.324 
2     6 <dbl [6]>  -0.396   0.0153
3     7 <dbl [7]>   0.506   0.711 
4     8 <dbl [8]>   0.463   0.537 
5     9 <dbl [9]>  -0.248  -0.555 
6    10 <dbl [10]> -0.153  -0.293 
Run Code Online (Sandbox Code Playgroud)
df <- …
Run Code Online (Sandbox Code Playgroud)

r tidyr purrr

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

Pandas如何在一组中获得独特的价值?

这是我的数据帧:

df = pd.DataFrame([['a',1],['a',1],['a',1],['a',2],['b',2],['b',2],['c',3]], columns=['letters','numbers'])

    letters numbers
0   a   1
1   a   1
2   a   1
3   a   2
4   b   2
5   b   2
6   c   3
Run Code Online (Sandbox Code Playgroud)

我需要按组('字母')'数字'中唯一值的数量.所以输出就是

a 2
b 1
c 1
Run Code Online (Sandbox Code Playgroud)

这是我(非常丑陋)的解决方案.它有效,但任何人都可以帮我找到更多的Pythonic方法pandas吗?

result = []
groups = list(df['letters'].unique())
for g in groups:

    filtered_df = df[df['letters'] == g]

    uniques = len(filtered_df['numbers'].unique())
    result.append((g, uniques))

[('a', 2), ('b', 1), ('c', 1)]
Run Code Online (Sandbox Code Playgroud)

python pandas

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