Pandas:在 mean/std 和 plus/minus 符号之间转换

Pandas: change between mean/std and plus/minus notations

假设我有一个 Pandas 的 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

反之.

我可以做到这一点 "by hand" 但我希望有一种使用 Pandas' 内置函数的优雅方式,它最终可以优雅地转换为 LaTeX(即 62±87 变成 \pm 87$).

我正在研究 Converting a column within pandas dataframe from int to string.apply(),但我不清楚如何将其用于此目的。

编辑

建议的答案似乎不涵盖 VICEVERSA:即将 A±DA 符号转换回两列 ADA

这是一种方法

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')

我在这里找到了一堆,所以可能是重复的:Combine two columns of text in dataframe in 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]