我想通过行计算创建一个新行。 我的数据框看起来像这样:
Para 01.21 02.21 03.21
<48h 22 25 38
>48h 0 1 3
我想计算每行的百分比:
目标
Para 01.21 02.21 03.21
<48h 22 25 38
>48h 0 1 3
Perc. 0% 4% 8%
我有一些关于附加新数据帧的想法,但没有真正成功。 谢谢您的帮助!
假设您很乐意就地修改输入 DataFrame,这将产生您所请求的确切输出:
df.loc['Perc.'] = (
df.loc['>48h'] / df.loc['<48h']
).apply(lambda x: f"{x:.0%}")
这假设打印输出中的第一列是 DataFrame 的索引。
稍微解开一下:
df.loc['Perc.'] =
将创建一个新行,并填充 =
右侧的值。df.loc['>48h'] / df.loc['<48h']
计算所需的比率,作为浮点数.apply
调用对新行的每个元素调用一个函数,将原始百分比数字转换为按照您请求的方式格式化的字符串。进一步解开这个问题:
f"{x}"
将 x
转换为字符串(本质上等同于 str(x)
)f"{x:.0%}"
通过添加 .0%
格式说明符 增强了上述功能,它将将该值显示为小数点后 0 位的百分比(即乘以 100,四舍五入到小数点后 0 位,然后添加 %
符号)。还有各种其他格式说明符可用于浮点数据。请注意,如果您想对结果值进行任何进一步处理,我建议不执行步骤 3 - 一旦您将数据转换为字符串,它显然不能是例如乘以其他数据。
如果您想要两全其美,将内部值保留为浮动比率,但将它们显示为百分比,您可以这样做:
df.loc['Perc.'] = (
df.loc['>48h'] / df.loc['<48h']
)
display_str = df.T.to_string(formatters={"Perc.": lambda x: f"{x:.0%}"})
print(display_str)
这将修改
df
以添加 Perc.
行,但其值将保持为实际浮动比率。那么 display_str
将是整个数据帧的适当格式的字符串表示形式,包括百分比。
请注意,
formatters
接受由列名称键控的字典,而不是行,因此您必须首先转置数据(df.T
),结果输出将被转置:
Para <48h >48h Perc.
0 1.21 22.0 0.0 0%
1 2.21 25.0 1.0 4%
2 3.21 38.0 3.0 8%
如果您在 Jupyter Notebook 中工作,您还可以使用
df.style.format
方法来实现类似的功能;打电话
df.T.style.format({"Perc.": "{:.0%}"})
将返回一个
pandas.io.formats.style.Styler
对象,但如果您在 Jupyter 笔记本中,它将像 DataFrame 一样呈现,相关列的格式如上所示。不过,这仅适用于逐列的基础,因此您需要转置。
para = ['01.21', '02.21', '03.21']
a = np.array(([22, 25, 38]))
b = np.array(([0, 1, 3]))
df = pd.DataFrame([para, a, b], index=['Para', '<48h', '>48h'], columns=['col0', 'col1', 'col2'])
perc = np.array(((b/a)*100))
df2 = pd.DataFrame([perc], index=['Perc.'], columns=['col0', 'col1', 'col2'])
df = df.append(df2)
print(df)
输出:
col0 col1 col2
Para 01.21 02.21 03.21
<48h 22 25 38
>48h 0 1 3
Perc. 0 4 7.89474
DataFrame.loc
选择行:
#If first column is not index create it
#df = df.set_index('Para')
df.loc['Perc'] = df.loc['>48h'].div(df.loc['<48h']).mul(100).round()
print (df)
01.21 02.21 03.21
Para
<48h 22.0 25.0 38.0
>48h 0.0 1.0 3.0
Perc 0.0 4.0 8.0
更好的是先转置,所以可以按列选择:
#If first column is not index create it
#df = df.set_index('Para')
df = df.T
df['Perc'] = df['>48h'].div(df['<48h']).mul(100).round()
print (df)
Para <48h >48h Perc
01.21 22 0 0.0
02.21 25 1 4.0
03.21 38 3 8.0
df.loc[键] = 行
这就是我们在 pandas 数据框中创建新行的方式