Как я могу добавить новые столбцы, используя другой фрейм данных (связанный со строковыми столбцами) в Pandas - PullRequest
2 голосов
/ 06 мая 2019

Запутанный заголовок, позвольте мне объяснить.У меня есть 2 кадра данных, как это:

кадр данных с именем df1: выглядит так (с миллионами строк в оригинале):

id `  text                             c1      
1     Hello world how are you people    1 
2     Hello people I am fine  people    1
3     Good Morning people               -1
4     Good Evening                      -1

Кадр данных с именем df2 выглядит так:

Word      count         Points         Percentage

hello        2             2              100
world        1             1              100
how          1             1              100
are          1             1              100
you          1             1              100
people       3             1              33.33
I            1             1              100
am           1             1              100
fine         1             1              100
Good         2             -2            -100
Morning      1             -1            -100
Evening      1             -1            -100
                -1

df2 столбцы с пояснениями:

count означает общее число раз, когда это слово появилось в df1

points - баллы, начисленные каждомуслово по какому-то алгоритму

percentage = количество очков / число * 100

Теперь я хочу добавить 40 новых столбцов в df1, в соответствии с точкой и процентом.Они будут выглядеть так:

perc_-90_2 perc_-80_2 perc_-70_2 perc_-60_2 perc_-50_2 perc_-40_2 perc_-20_2 perc_-10_2 perc_0_2 perc_10_2 perc_20_2 perc_30_2 perc_40_2 perc_50_2 perc_60_2 perc_70_2 perc_80_2 perc_90_2

perc_-90_1 perc_-80_1 perc_-70_1 perc_-60_1 perc_-50_1 perc_-40_1 perc_-20_1 perc_-10_1 perc_0_1 perc_10_1 perc_20_1 perc_30_1 perc_40_1 perc_50_1 perc_60_ perc_70_1 perc_80_1 perc_90_1

Позвольте мне разобрать это.Имя столбца состоит из 3 частей:

1.) perc просто строка, ничего не значит

2.) Числа в диапазоне от -90 до +90.Например, Здесь -90 означает, что процент составляет -90 в df2.Теперь, например, если слово имеет процентное значение в диапазоне 81-90, то в этой строке будет значение 1, а столбец с именем prec_-80_xx.xx - третья часть.

3.) Третья часть - количество.Здесь я хочу два типа отсчетов.1 и 2.Как пример, приведенный в пункте 2, если количество слов находится в диапазоне от 0 до 1, тогда значение будет 1 в столбце prec_-80_1.Если количество слов равно 2 или более, то значение будет 1 в столбце prec_-80_2.

Надеюсь, это не очень запутанно.

1 Ответ

2 голосов
/ 07 мая 2019

Использование:

#change previous answer with add id for matching
df2 = (df.drop_duplicates(['id','Word'])
         .groupby('Word', sort=False)
         .agg({'c1':['sum','size'], 'id':'first'})
         )
df2.columns = df2.columns.map(''.join)
df2 = df2.reset_index()
df2 = df2.rename(columns={'c1sum':'Points','c1size':'Totalcount','idfirst':'id'})

df2['Percentage'] = df2['Points'] / df2['Totalcount'] * 100


s1 = df2['Percentage'].div(10).astype(int).mul(10).astype(str)
s2 = np.where(df2['Totalcount'] == 1, '1', '2')
#s2= np.where(df1['Totalcount'].isin([0,1]), '1', '2')
#create colum by join
df2['new'] = 'perc_' + s1 + '_' +s2

#create indicator DataFrame
df3 = pd.get_dummies(df2[['id','new']].drop_duplicates().set_index('id'), 
                     prefix='', 
                     prefix_sep='').max(level=0)
print (df3)

#reindex for add missing columns
c = 'perc_' + pd.Series(np.arange(-100, 110, 10).astype(str)) + '_'
cols = (c + '1').append(c + '2')
#join to original df1
df = df1.join(df3.reindex(columns=cols, fill_value=0), on='id')

print (df)
   id                            text  c1  perc_-100_1  perc_-90_1  \
0   1  Hello world how are you people   1            0           0   
1   2   Hello people I am fine people   1            0           0   
2   3             Good Morning people  -1            1           0   
3   4                    Good Evening  -1            1           0   

   perc_-80_1  perc_-70_1  perc_-60_1  perc_-50_1  perc_-40_1  ...  perc_10_2  \
0           0           0           0           0           0  ...          0   
1           0           0           0           0           0  ...          0   
2           0           0           0           0           0  ...          0   
3           0           0           0           0           0  ...          0   

   perc_20_2  perc_30_2  perc_40_2  perc_50_2  perc_60_2  perc_70_2  \
0          0          1          0          0          0          0   
1          0          0          0          0          0          0   
2          0          0          0          0          0          0   
3          0          0          0          0          0          0   

   perc_80_2  perc_90_2  perc_100_2  
0          0          0           1  
1          0          0           0  
2          0          0           0  
3          0          0           0  

[4 rows x 45 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...