Это даст вам DataFrame, который вам нужен. По большей части вы были осведомлены о том, что вам нужно было сделать, чтобы решить эту проблему:
import pandas as pd
def buld_key_df(values:list, number:int) -> pd.DataFrame:
return pd.DataFrame({
f'name ({number}s)' : values,
f'code ({number}s)' : [number + i for i in range(len(values))],
})
df = pd.DataFrame({
'A': [
'Rack Ants', 'EB Animals', 'IN Penguin',
'IN Penguin', 'IN Hippo', 'T-IPS-ACK',
'AA-BMUL', 'VB-SEM-012', 'VE-PAG'
],
'B': [
'EB Animals', 'Applications', 'EB Animals',
'EB Animals', 'EB Humans', 'Applications',
'IN Penguin', 'IN Hippo', 'IN Crocodile'
],
})
unique = pd.concat([df['A'],df['B']]).unique()
df_300 = [x for x in unique if x.startswith('EB ')]
df_400 = [x for x in unique if x.startswith('IN ')]
df_500 = [x for x in unique if x not in df_300 + df_400]
df_300 = buld_key_df(df_300, 300)
df_400 = buld_key_df(df_400, 400)
df_500 = buld_key_df(df_500, 500)
df = pd.concat([df, df_300, df_400, df_500], axis=1).fillna('')
pd.set_option('display.max_columns', 8)
print(df)
Пример кода в Python Репетитор
Редактировать: It может быть более оптимальным заменить три списка для df_300
, df_400
и df_500
на for
l oop, как показано ниже. Это увеличение скорости будет заметно только в том случае, если у вас есть огромное количество уникальных значений, которым вы назначаете коды, и если это так, вы, вероятно, захотите, чтобы коды составляли десятки тысяч, а не сотни:
import pandas as pd
def buld_key_df(values:list, number:int) -> pd.DataFrame:
return pd.DataFrame({
f'name ({number}s)' : values,
f'code ({number}s)' : [number + i for i in range(len(values))],
})
df = pd.DataFrame({
'A': [
'Rack Ants', 'EB Animals', 'IN Penguin',
'IN Penguin', 'IN Hippo', 'T-IPS-ACK',
'AA-BMUL', 'VB-SEM-012', 'VE-PAG'
],
'B': [
'EB Animals', 'Applications', 'EB Animals',
'EB Animals', 'EB Humans', 'Applications',
'IN Penguin', 'IN Hippo', 'IN Crocodile'
],
})
unique = pd.concat([df['A'],df['B']]).unique()
df_30k, df_40k, df_50k = [], [], []
for x in unique:
if x.startswith('EB '):
df_30k.append(x)
elif x.startswith('IN '):
df_40k.append(x)
else:
df_50k.append(x)
df_30k = buld_key_df(df_30k, 30000)
df_40k = buld_key_df(df_40k, 40000)
df_50k = buld_key_df(df_50k, 50000)
df = pd.concat([df, df_30k, df_40k, df_50k], axis=1).fillna('')
pd.set_option('display.max_columns', 8)
print(df)
Пример 2 кода в python tutor