假设我有一只熊猫的
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
。
这是一种方法
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')
在这里我发现了一堆,所以可能是重复的:在 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]
一种更优雅和可扩展的方法是使用+/-(我想到了值和错误)来堆叠、分组和组合单独的数据帧。所讨论的问题是一个特殊情况。
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