Pandas:平均值/标准差和加/减符号之间的变化

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

假设我有一只熊猫的

DataFrame

import numpy as np
import pandas as pd

df = pd.DataFrame(
    np.random.randint(0, 100, size=(10, 4)), columns=('A', 'DA', 'B', 'DB'))

输出:

    A  DA   B  DB
0  62  87  10  39
1  56   7  81  12
2  37  26  21  44
3  56  26  42  32
4  29  45  11   9
5  11  85   4  79
6  87  31  61  90
7   5  55  26  47
8  55  94  20  84
9  52  26  72  19

我想把它转换成这样:

       A      B
0  62±87  10±39
1   56±7  81±12
2  37±26  21±44
3  56±26  42±32
4  29±45   11±9
5  11±85   4±79
6  87±31  61±90
7   5±55  26±47
8  55±94  20±84
9  52±26  72±19

反之亦然

我可以“手动”完成此操作,但我希望有一种使用 Pandas 内置插件的优雅方式,最终可以优雅地转换为 LaTeX(即

62±87
变为
$62 \pm 87$
)。

我正在研究

.apply()
将 pandas 数据框中的列从 int 转换为字符串,但我不清楚如何将其用于此目的。

编辑

建议的答案似乎没有涵盖 VICEVERSA:即将

A±DA
符号转换回两列
A
DA

python pandas numpy string-formatting
3个回答
7
投票

这是一种方法

In [1336]: (df.groupby(df.columns.str[-1], axis=1)
              .apply(lambda x: x.astype(str).apply('±'.join, 1)))
Out[1336]:
       A      B
0  62±87  10±39
1   56±7  81±12
2  37±26  21±44
3  56±26  42±32
4  29±45   11±9
5  11±85   4±79
6  87±31  61±90
7   5±55  26±47
8  55±94  20±84
9  52±26  72±19

另一种方式

In [1351]: pd.DataFrame({c: df.filter(like=c).astype(str).apply('±'.join, 1) 
                         for c in df.columns.str[-1].unique()})
Out[1351]:
       A      B
0  62±87  10±39
1   56±7  81±12
2  37±26  21±44
3  56±26  42±32
4  29±45   11±9
5  11±85   4±79
6  87±31  61±90
7   5±55  26±47
8  55±94  20±84
9  52±26  72±19

或者,也作为

In [1386]: pd.DataFrame({c: ['±'.join(v) for v in df.filter(like='A').astype(str).values]
      ...:               for c in df.columns.str[-1].unique()})

并且,相反假设

dff
是你的字符串连接数据框

In [1357]: pd.concat([dff[c].str.split('±', expand=True).rename(columns={0:c, 1:'D'+c})
                      for c in dff.columns], axis=1)
Out[1357]:
    A  DA   B  DB
0  62  87  10  39
1  56   7  81  12
2  37  26  21  44
3  56  26  42  32
4  29  45  11   9
5  11  85   4  79
6  87  31  61  90
7   5  55  26  47
8  55  94  20  84
9  52  26  72  19

详情

In [1358]: df
Out[1358]:
    A  DA   B  DB
0  62  87  10  39
1  56   7  81  12
2  37  26  21  44
3  56  26  42  32
4  29  45  11   9
5  11  85   4  79
6  87  31  61  90
7   5  55  26  47
8  55  94  20  84
9  52  26  72  19

In [1359]: dff
Out[1359]:
       A      B
0  62±87  10±39
1   56±7  81±12
2  37±26  21±44
3  56±26  42±32
4  29±45   11±9
5  11±85   4±79
6  87±31  61±90
7   5±55  26±47
8  55±94  20±84
9  52±26  72±19

帮手

In [1377]: df.columns.str[-1]
Out[1377]: Index([u'A', u'A', u'B', u'B'], dtype='object')

In [1378]: df.columns.str[-1].unique()
Out[1378]: Index([u'A', u'B'], dtype='object')

1
投票

在这里我发现了一堆,所以可能是重复的:在 pandas/python 的数据框中合并两列文本

这个最让我信服:

import io
import pandas as pd

string = """A,DA,B,DB
62,87,10,39"""

df = pd.read_csv(io.StringIO(string),sep=",")

cols = [i for i in df.columns if len(i) == 1]

for i in cols:
    df[i] = df[i].astype(str)+ "±" + df["D"+i].astype(str)

df[cols]

0
投票

一种更优雅和可扩展的方法是使用+/-(我想到了值和错误)来堆叠、分组和组合单独的数据帧。所讨论的问题是一个特殊情况。

mu = pd.DataFrame({'trace1':[1,2],'trace2':[3,4]})
std = pd.DataFrame({'trace1':[0.01,0.02],'trace2':[0.03,0.04]})
groupper = pd.Series(list(mu.index)+list(std.index))
pd.concat([mu,std],axis=0).groupby(groupper).agg(lambda s: '+'.join(map(str,s)))

这个例子给出了

    trace1  trace2
0   1.0+0.01    3.0+0.03
1   2.0+0.02    4.0+0.04
© www.soinside.com 2019 - 2024. All rights reserved.