Python 将数据帧中的列拆分为两个新数据帧

Python 将数据帧中的列拆分为两个新数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我在一个数据框中有数据,其中一个单元格中有两个观察值: small medium large apples 258 0.12% 39 0.0091% 89 0.18% carrots 97 0.16% 6 0.012% 26 0.26% bananas 377 0.14

我在一个数据框中有数据,其中一个单元格中有两个观察值:

                          small             medium        large
apples                258 0.12%         39 0.0091%     89 0.18%
carrots                97 0.16%          6  0.012%     26 0.26%
bananas               377 0.14%         12  0.018%    128 0.22%
pears                 206 0.17%          7  0.034%    116 0.24%
我想创建两个单独的数据帧来分割观察结果。大概是这样的:

                    small           medium          large
apples                258               39             89
carrots                97                6             26
bananas               377               12            128
pears                 206                7            116
第二个:

                      small             medium        large
apples                0.12%            0.0091%        0.18%
carrots               0.16%             0.012%        0.26%
bananas               0.14%             0.018%        0.22%
pears                 0.17%             0.034%        0.24%
我可以按列进行拆分:

 new_df1 = df['small'].str.extract('([^\s]+)', expand=True)
 new_df2 = df['small'].str.extract('([^\s]*$)', expand=True)
但我不知道如何对整个数据帧执行此操作。我有许多类似的数据帧,具有不同的列和行名称,因此我正在寻找一个可以重用的解决方案。谢谢

您可以这样做:

df1 = df.applymap(lambda x: x.split()[0])
df2 = df.applymap(lambda x: x.split()[1])
示例df:

   small medium
0  0 33%  0 33%
1  1 44%  1 33%
2  2 55%  1 55%
df1:

df2:


使用
pd.DataFrame.applymap
并通过
操作符.itemgetter
提取每个组件:

from operator import itemgetter

df = pd.DataFrame([['258 0.12%', '39 0.0091%', '89 0.18%'],
                   ['97 0.16%', '6  0.012%', '26 0.26%']],
                  columns=['small', 'medium', 'large'],
                  index=['apples', 'carrots'])

split = df.applymap(lambda x: x.split())

df1 = split.applymap(itemgetter(0)).astype(int)
df2 = split.applymap(lambda x: x[1][:-1]).astype(float) / 100
注意:您必须注意将字符串分别转换为
int
float

print(df1)

         small  medium  large
apples     258      39     89
carrots     97       6     26

print(df2)

          small    medium   large
apples   0.0012  0.000091  0.0018
carrots  0.0016  0.000120  0.0026

请注意,生成的数据帧将具有一系列类型
object
。您应该将其转换为数字(例如,如我的答案中的数字),以避免性能损失。否则,数据帧将只是指针的集合。
from operator import itemgetter

df = pd.DataFrame([['258 0.12%', '39 0.0091%', '89 0.18%'],
                   ['97 0.16%', '6  0.012%', '26 0.26%']],
                  columns=['small', 'medium', 'large'],
                  index=['apples', 'carrots'])

split = df.applymap(lambda x: x.split())

df1 = split.applymap(itemgetter(0)).astype(int)
df2 = split.applymap(lambda x: x[1][:-1]).astype(float) / 100
print(df1)

         small  medium  large
apples     258      39     89
carrots     97       6     26

print(df2)

          small    medium   large
apples   0.0012  0.000091  0.0018
carrots  0.0016  0.000120  0.0026