如何在 Pandas 数据框中的其他行之间创建新行?

问题描述 投票:0回答:5

我想通过行计算创建一个新行。 我的数据框看起来像这样:

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%

我有一些关于附加新数据帧的想法,但没有真正成功。 谢谢您的帮助!

python pandas dataframe rows
5个回答
3
投票

假设您很乐意就地修改输入 DataFrame,这将产生您所请求的确切输出:

df.loc['Perc.'] = (
    df.loc['>48h'] / df.loc['<48h']
).apply(lambda x: f"{x:.0%}")

这假设打印输出中的第一列是 DataFrame 的索引。

稍微解开一下:

  1. 赋值
    df.loc['Perc.'] = 
    将创建一个新行,并填充
    =
    右侧的值。
  2. df.loc['>48h'] / df.loc['<48h']
    计算所需的比率,作为浮点数
  3. .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 一样呈现,相关列的格式如上所示。不过,这仅适用于逐列的基础,因此您需要转置。


0
投票
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

0
投票

使用

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

0
投票

df.loc[键] = 行

这就是我们在 pandas 数据框中创建新行的方式


0
投票

这样存储数据不是最佳实践。阅读Hadley 的整洁数据论文

但是在一行中你可以这样做。

df.loc['perc'] = df.iloc[2]/df.iloc[1]
© www.soinside.com 2019 - 2024. All rights reserved.