作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题涉及在 Python 中使用与学术出版物中找到的表格相对应的格式化输出进行描述性统计的最佳实践:平均值在下面的括号中带有各自的标准偏差。最终目标是能够以 Latex 表格格式(或其他格式、html 等)导出它。
示例( Deucherta & Eugster (2018) ):
Pandas :
在 Pandas 中进行描述性统计的经典解决方案是使用 describe()
DataFrame
的方法.
import numpy as np
import pandas as pd
# Generate a DataFrame to have an example
df = pd.DataFrame(
{"Age" : np.random.normal(20,15,5),
"Income": np.random.pareto(1,5)*20_000 }
)
# The describe method to get means and stds
df.describe().loc[["mean", "std"]].T
>>>
mean std
Age 15.322797 13.449727
Income 97755.733510 143683.686484
Age 15.32
(13.44)
Income 97755.73
(143683.68)
df2 = pd.DataFrame(
{"Age" : np.random.normal(20,15,5),
"Income": np.random.pareto(1,5)*20_000 }
)
df_c = pd.concat([df,df2], keys = ["A", "B"])
>>>
A B
Age 23.15 21.33
(11.62) (9.34)
Income 68415.53 46619.51
(95612.40) (64596.10)
idx = pd.IndexSlice
df_desc = (df_c
).groupby(level = 0, axis = 0).describe()
df_desc = df_desc.loc[idx[:],idx[:,["mean", "std"]]].T
df_desc.loc[idx[:,["std"]],idx[:]] = df_desc.loc[idx[:,["std"]],idx[:]
].applymap(
lambda x: "("+"{:.2f}".format(x)+")")
print(df_desc)
>>>
A B
Age mean 23.1565 21.3359
std (11.62) (9.34)
Income mean 68415.5 46619.5
std (95612.40) (64596.10)
df_desc.to_latex()
>>>
\begin{tabular}{llll}
\toprule
& & A & B \\
\midrule
Age & mean & 5.5905 & 29.5894 \\
& std & (16.41) & (13.03) \\
Income & mean & 531970 & 72653.7 \\
& std & (875272.44) & (79690.18) \\
\bottomrule
\end{tabular}
&
表格的字符没有对齐,这使得编辑有点乏味(我在 VSCode 中使用扩展来对齐
&
)
最佳答案
我刚刚遇到了类似的问题并找到了您的帖子,所以这就是我处理您提到的问题的方法。
问题1:隐藏第二个索引列
我更喜欢解决方案 b),但为了说明目的,将 a) 留在这里。
a) droplevel & set_index
df_desc.index.droplevel(level=1)
>>>
Index(['Age', 'Age', 'Income', 'Income'], dtype='object')
将这段代码与
set_index
一起使用表达:
df_desc.set_index(df_desc.index.droplevel(level=1), inplace=True)
这导致:
print(df_desc)
>>>
A B
Age 17.1527 23.9678
Age (19.73) (12.01)
Income 293271 12178.8
Income (400059.27) (14483.35)
这看起来并不令人满意,因为索引值 Age 和 Income 分别出现了两次。
pd.DataFrame.values
创建新的 DataFrame并手动分配索引
df_desc = df_desc.reset_index(drop=True)
print(df_desc)
>>>
A B
0 17.306 11.425
1 (14.40) (16.67)
2 88016.7 67280.4
3 (73054.44) (54953.69)
其次,创建新的 DataFrame 手动指定索引和列名。
df_desc.values
作为数据参数(第一个位置)。
df_new = pd.DataFrame(df_desc.values, index=["Age", "", "Income", ""], columns=["A", "B"])
print(df_new)
>>>
A B
Age 27.7039 20.8031
(13.99) (13.92)
Income 20690.7 7370.44
(29470.03) (13279.10)
问题 2:对齐 LaTeX 表
df_new.to_latex()
确实产生了一个有点乱的
str
输出:
>>>
'\\begin{tabular}{lll}\n\\toprule\n{} & A & B \\\\\n\\midrule\nAge & 27.7039 & 20.8031 \\\\\n & (13.99) & (13.92) \\\\\nIncome & 20690.7 & 7370.44 \\\\\n & (29470.03) & (13279.10) \\\\\n\\bottomrule\n\\end{tabular}\n'
但是,将其包裹在
print
中语句产生所需的输出:
print(df_new.to_latex())
>>>
\begin{tabular}{lll}
\toprule
{} & A & B \\
\midrule
Age & 27.7039 & 20.8031 \\
& (13.99) & (13.92) \\
Income & 20690.7 & 7370.44 \\
& (29470.03) & (13279.10) \\
\bottomrule
\end{tabular}
此外,将表格导出到 LaTeX 文档相当简单。
to_latex()
已经创建了一个表格,所以你只需要把它写到一个文件中,然后使用
\input
在您的 LaTeX 文档中。
with open('mytable.tex','w') as tf:
tf.write(df_new.to_latex())
ii) 在 LaTeX 文档中使用导出的表格
\documentclass{article}
\usepackage{booktabs}
\begin{document}
\input{mytable}
\end{document}
此示例假定
mytable.tex
和 LaTeX 文档在同一个文件夹中。
booktabs
需要包,因为
to_latex()
使用
booktabs
表规则的命令。
关于python - Python/with Pandas 中的描述性统计,括号中为 std,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54466196/
我有一个网站,我正在为所有链接使用干净的 URL。我想知道对于简短的基本 URL 与较长的描述性 URL 有何看法。 例如,如果我的网站是关于 Georgia Bulldog 足球新闻的,那么哪个网站
我一直在尝试在我们的 Node 应用程序中实现 Joi(joi 是独立的,而不是 hapi),它似乎正确地验证了模式,但错误总是一样的 [ValidationError: value must be
我是一名优秀的程序员,十分优秀!