我有一个像这样的熊猫数据帧:
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 来完成吗?我尝试遍历行但收效甚微。
我有一个水平条形图,例如,seaborn 文档中示例的简化版本:https ://seaborn.pydata.org/examples/horizontal_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)
我假设水平图的工作方式不同?
我想按组删除基于百分位 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) 我正在处理本示例中的代码,并对其进行了一些修改:
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。分别显示heatmap和text单独显示时,下面的代码有效,但是当我将它们组合使用时,会出现错误。
# 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) 我将使用内置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) 假设我有一个数据框:
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)
注意:我在下面的回答中对迄今为止介绍的所有方法进行了基准测试。
我想用 绘制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
我试图重新命名指数和传递x和y参数,但我不能”得到它的工作。
我的代码在这里很糟糕,是否有改进它的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) 我经常使用如下所示的模式,我将数据存储在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) 这是我的数据帧:
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)