Pandas的条件旗

hwamh0ep  于 2023-01-19  发布在  其他
关注(0)|答案(3)|浏览(107)

我有一个 Dataframe df:-
| 识别号|1F列|2F列|3F列|4G列|
| - ------|- ------|- ------|- ------|- ------|
| 1个|无|1个|1个|1个|
| 第二章|无|1个|无|无|
| 三个|1个|1个|无|1个|
| 四个|无|无|无|1个|
| 五个|无|无|无|无|
| 六个|1个|1个|1个|1个|
我有两种类型的列名,一种包含F,另一种包含G
F_类型和G_类型:如果F的列名中至少有一个是1,我想标记1,同样,如果G的列名中至少有一个是1,我想标记1(F_type & G_Type是列名)。
Comm 1:如果F_type和G_Type均为1,我希望显示字符串Good如果F_type为1且G_Type为0,则显示字符串4G如果F_type为0且G_Type为1,则显示字符串1F如果F_type和G_Type均为0,则显示字符串1F
Comm 2:如果F_type和G_Type均为0,则为字符串Hard,否则为Good,如果Comm 1为Good,则为Soft
| 识别号|F_类型|G_类型|通信1|通信2|
| - ------|- ------|- ------|- ------|- ------|
| 1个|1个|1个|好|好|
| 第二章|1个|无|第四代|柔软|
| 三个|1个|1个|好|好|
| 四个|无|1个|1F|软|
| 五个|无|无|1F|硬|
| 六个|1个|1个|好|好|
我有一个拥抱记录ID(100万)什么是最好的方法来实现这一点在更短的时间?

yeotifhr

yeotifhr1#

如果你正在处理一个更大的数据集,其中一个方法就是引入numpy

import numpy as np

df['F_Type'] = df[['1F_col', '2F_col', '3F_col']].any(axis=1).astype(int)
df['G_Type'] = df[['4G_col']].any(axis=1).astype(int)

df['Comm1'] = np.where(df['F_Type'] & df['G_Type'], 'Good', 
                        np.where(df['F_Type'], '4G', '1F'))

df['Comm2'] = np.where(np.logical_and(df['F_Type'] == 0, df['G_Type'] == 0), 
                        'Hard', np.where(df['Comm1'] == 'Good', 'Good', 'Soft'))

print(df)
ID  1F_col  2F_col  3F_col  4G_col  F_Type  G_Type Comm1 Comm2
0   1       0       1       1       1       1       1  Good  Good
1   2       0       1       0       0       1       0    4G  Soft
2   3       1       1       0       1       1       1  Good  Good
3   4       0       0       0       1       0       1    1F  Soft
4   5       0       0       0       0       0       0    1F  Hard
5   6       1       1       1       1       1       1  Good  Good
df = df.drop(columns=['1F_col', '2F_col', '3F_col', '4G_col'])
print(df)
ID  F_Type  G_Type Comm1 Comm2
0   1       1       1  Good  Good
1   2       1       0    4G  Soft
2   3       1       1  Good  Good
3   4       0       1    1F  Soft
4   5       0       0    1F  Hard
5   6       1       1  Good  Good
idv4meu8

idv4meu82#

df_2 = pd.DataFrame(df.ID)
df_2["F_Type"] = (df.loc[:,df.columns.str.match("[0-9]*F_.*")]==1).any(1)
df_2["G_Type"] = (df.loc[:,df.columns.str.match("[0-9]*G_.*")]==1).any(1)

#Comm1
df_2.loc[df_2.F_Type & df_2.G_Type, "Comm1"] = "Good"
df_2.loc[df_2.F_Type & (~df_2.G_Type), "Comm1"] = "4G"
df_2.loc[~df_2.F_Type, "Comm1"] = "1F"

#Comm2
df_2["Comm2"] = df_2.Comm1
df_2.loc[(~df_2[["F_Type","G_Type"]]).all(1), "Comm2"] = "Hard"
df_2.loc[df_2[["F_Type","G_Type"]].sum(1)==1, "Comm2"] = "Soft"

#converting F_type and G_Type in int type
df_2[["F_Type","G_Type"]] = df_2[["F_Type","G_Type"]].astype(int)
df_2
u59ebvdq

u59ebvdq3#

下面是另一种方法:

d = {(1,1):['Good','Good'],
(1,0):['4G','soft'],
(0,1):['1F','soft'],
(0,0):['1F','hard']}

df1 = df.set_index('ID').groupby(lambda x: x[1],axis=1).any().astype(int)

df2 = pd.DataFrame(pd.MultiIndex.from_frame(df1).map(d).tolist(),columns = ['Comm1','Comm2'])

final_df = pd.concat([df1.reset_index(),df2],axis=1)

输出:

ID  F  G Comm1 Comm2
0   1  1  1  Good  Good
1   2  1  0    4G  soft
2   3  1  1  Good  Good
3   4  0  1    1F  soft
4   5  0  0    1F  hard
5   6  1  1  Good  Good

相关问题