我的数据帧如下所示:
列名“Types”显示了定义的每个类型
我想添加另一个名为“number”的列,定义如下。

df=pd.DataFrame({'Sex':['M','F','F','M'],'Age':[30,31,33,32],'Types':['A','C','B','D']})

Out[8]:

    Age Sex  Types
0   30   M      A
1   31   F      C
2   33   F      B
3   32   M      D

我下面还有一张男性桌子;
每列代表类型!
(对我来说创建表很困难,有没有其他简单的方法来创建?)
table_M = pd.DataFrame(np.arange(20).reshape(4,5),index=[30,31,32,33],columns=["A","B","C","D","E"])
table_M.index.name="Age(male)"

         A      B      C      D      E
Age(male)
30       0      1      2      3      4
31       5      6      7      8      9
32      10     11     12     13     14
33      15     16     17     18     19

我下面有一张女性桌子;
table_F = pd.DataFrame(np.arange(20,40).reshape(4,5),index=[30,31,32,33],columns=["A","B","C","D","E"])
table_F.index.name="Age(female)"

        A      B      C      D      E
Age(female)
30      20     21     22     23     24
31      25     26     27     28     29
32      30     31     32     33     34
33      35     36     37     38     39

所以我想加上‘数字’栏,如下所示;
    Age Sex  Types   number
0   30   M      A      0
1   31   F      C     27
2   33   F      B     36
3   32   M      D     13

此数字列是指阴表和阳表。每个年龄、类型和性别。
对我来说太复杂了。
我能问一下如何加“数字”栏吗?

最佳答案

我建议重塑你的男女餐桌:

males = (table_M.stack().to_frame('number').assign(Sex='M').reset_index()
                .rename(columns={'Age(male)': 'Age', 'level_1': 'Types'}))

females = (table_F.stack().to_frame('number').assign(Sex='F').reset_index()
                  .rename(columns={'Age(female)': 'Age', 'level_1': 'Types'}))

reshaped = pd.concat([males, females], ignore_index=True)

然后合并:
df.merge(reshaped)
Out:
   Age Sex Types  number
0   30   M     A       0
1   31   F     C      27
2   33   F     B      36
3   32   M     D      13

这样做的目的是堆叠雄表和雌表的列,并指定一个显示性别的指示符列(“M”和“F”)。females.head()如下所示:
females.head()
Out:
   Age Types  number Sex
0   30     A      20   F
1   30     B      21   F
2   30     C      22   F
3   30     D      23   F
4   30     E      24   F

以及males.head()
males.head()
Out:
   Age Types  number Sex
0   30     A       0   M
1   30     B       1   M
2   30     C       2   M
3   30     D       3   M
4   30     E       4   M

concat将这两个数据组合成一个数据帧,默认情况下merge在公共列上工作,因此它在“Age”、“Sex”、“Types”列中查找匹配项,并基于此合并两个数据帧。
另一种可能是使用df.lookup:
df.loc[df['Sex']=='M', 'number'] = table_M.lookup(*df.loc[df['Sex']=='M', ['Age', 'Types']].values.T)
df.loc[df['Sex']=='F', 'number'] = table_F.lookup(*df.loc[df['Sex']=='F', ['Age', 'Types']].values.T)

df
Out:
   Age Sex Types  number
0   30   M     A     0.0
1   31   F     C    27.0
2   33   F     B    36.0
3   32   M     D    13.0

这将查找table_M中的雄性和table_F中的雌性。

关于python - 复杂请参阅另一张表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39191088/

10-16 00:53