【问题标题】:Pandas: change between mean/std and plus/minus notationsPandas:在均值/标准和加/减符号之间变化
【发布时间】:2018-03-17 00:29:21
【问题描述】:

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

反之亦然

我可以“手动”完成此操作,但我希望能以一种优雅的方式使用 Pandas 的内置插件,最终可以优雅地转换为 LaTeX(即 62±87 变为 $62 \pm 87$)。

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

编辑

建议的答案似乎不包括 VICEVERSA:即从 A±DA 符号转换回两列 ADA

【问题讨论】:

标签: python pandas numpy string-formatting


【解决方案1】:

在这里我发现了一堆,所以可能是重复的: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]

【讨论】:

  • 不过,这并不容易扩展到需要合并的许多列。
  • @norok2 这不是最初的问题,但是是的.. 你说得有道理,但是经过一些小的修改,我使它起作用了。保持简单,我想说:)。上面的解决方案也很有效。
【解决方案2】:

这是一种方法

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

【讨论】:

  • 这很好地解决了它。如果我理解正确df.columns.str[-1].unique() 会选择所有以不同字符结尾的列。很高兴能解释一下。最终“分组”不以D 甚至Δ 开头的列可能更有用。
猜你喜欢
  • 2021-06-17
  • 1970-01-01
  • 2021-02-26
  • 2023-03-28
  • 1970-01-01
  • 2016-04-30
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多