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
符号转换回两列 A
和 DA
。
这是一种方法
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]
假设我有一个 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
符号转换回两列 A
和 DA
。
这是一种方法
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]