numpy 在Python中使用另一个表的值作为新列创建表

polkgigr  于 2023-06-06  发布在  Python
关注(0)|答案(3)|浏览(540)

我在Numpy和Pandas工作。
我有一个贷款表,其特征是 * 国家 * 和 * 部门 *。
| 贷款数量|行业|国家|
| - -----|- -----|- -----|
| 贷款1|食物|德国|
| 贷款2|电信|意大利|
| 贷款3|汽车|日本|
| 贷款4|食物|日本|
| 贷款5|电信|德国|
| 贷款6|汽车|意大利|
我需要下降的部门和国家的重复,即.选择这2个特征的唯一值,并将它们用作列,如果贷款在该国家或部门处于活动状态,则创建一个布尔值为1/0的表,如下所示:
| 贷款数量|食物|电信|汽车|德国|意大利|日本|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 贷款1| 1| 0| 0| 1| 0| 0|
| 贷款2| 0| 1| 0| 0| 1| 0|
| 贷款3| 0| 0| 1| 0| 0| 1|
| 贷款4| 1| 0| 0| 0| 0| 1|
| 贷款5| 0| 1| 0| 1| 0| 0|
| 贷款6| 0| 0| 1| 0| 1| 0|
所以,第一个表中的Loan 1以食品为部门,以德国为国家;然后,在第二个表中,它在列food和德国上具有1,并且在所有其他列上具有0。
这似乎是一个pivot_table,但我不明白我怎么能把1/0作为值?顺便问一下,最简单的方法是什么?
谢谢

tpgth1q7

tpgth1q71#

可以使用get_dummiesgroupby.sum

out = df[['# LOAN']].join(pd.get_dummies(df[['SECTOR', 'COUNTRY']].stack())
                            .groupby(level=0).sum())
  • 注意:如果两列有可能具有相同的值,则使用.groupby(level=0).max().astype(int)。*

输出:

# LOAN  auto  food  germany  italy  japan  telecom
0  Loan 1     0     1        1      0      0        0
1  Loan 2     0     0        0      1      0        1
2  Loan 3     1     0        0      0      1        0
3  Loan 4     0     1        0      0      1        0
4  Loan 5     0     0        1      0      0        1
5  Loan 6     1     0        0      1      0        0

备选方案:
关于str.get_dummies

out = df[['# LOAN']].join(df[['SECTOR', 'COUNTRY']]
                          .agg('|'.join, axis=1)
                          .str.get_dummies()
                          )

crosstab

cols = ['SECTOR', 'COUNTRY']

out = (pd.concat(pd.crosstab(df['# LOAN'], df[c]) for c in cols)
         .groupby(level=0).sum().reset_index()
       )
ryevplcw

ryevplcw2#

如果你使用sklearn,你可以使用OneHotEncoderColumnTransformer

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

ct = ColumnTransformer(
    [('OHE', OneHotEncoder(dtype=int), ['SECTOR', 'COUNTRY'])],
    remainder='passthrough', verbose_feature_names_out=False
)
out = pd.DataFrame(ct.fit_transform(df), columns=ct.get_feature_names_out())

输出:

>>> out
  SECTOR_auto SECTOR_food SECTOR_telecom COUNTRY_germany COUNTRY_italy COUNTRY_japan  # LOAN
0           0           1              0               1             0             0  Loan 1
1           0           0              1               0             1             0  Loan 2
2           1           0              0               0             0             1  Loan 3
3           0           1              0               0             0             1  Loan 4
4           0           0              1               1             0             0  Loan 5
5           1           0              0               0             1             0  Loan 6
w6mmgewl

w6mmgewl3#

你要找的是独热编码。有一个关于如何从pd.DataFrame()中获取的很棒的线程:How can I one hot encode in Python?
控制论的回答相当彻底
编辑:mozway在这个线程上的回答是完全正确的--getdummy的是pandas fxn的one-hot编码,我相信他们在链接的线程中使用了相同的编码

相关问题