Фильтрация одного DataFrame по уникальным значениям в другом DataFrame - PullRequest
2 голосов
/ 26 апреля 2019

У меня есть 2 кадра данных Python:

Первый Dataframe содержит все данные, импортированные в DataFrame, который состоит из «prodcode», «sentiment», «summaryText», «reviewText» и т. Д. всех исходных данных обзора.

DFF = DFF[['prodcode', 'summaryText', 'reviewText', 'overall', 'reviewerID', 'reviewerName', 'helpful','reviewTime', 'unixReviewTime', 'sentiment','textLength']]

, который производит:


     prodcode                                 summaryText                                         reviewText  overall      reviewerID    ...       helpful   reviewTime unixReviewTime  sentiment textLength
0  B00002243X  Work Well - Should Have Bought Longer Ones  I needed a set of jumper cables for my new car...      5.0  A3F73SC1LY51OO    ...        [4, 4]  08 17, 2011     1313539200          2        516
1  B00002243X                            Okay long cables  These long cables work fine for my truck, but ...      4.0  A20S66SKYXULG2    ...        [1, 1]   09 4, 2011     1315094400          2        265
2  B00002243X                  Looks and feels heavy Duty  Can't comment much on these since they have no...      5.0  A2I8LFSN2IS5EO    ...        [0, 0]  07 25, 2013     1374710400          2       1142
3  B00002243X       Excellent choice for Jumper Cables!!!  I absolutley love Amazon!!!  For the price of ...      5.0  A3GT2EWQSO45ZG    ...      [19, 19]  12 21, 2010     1292889600          2       4739
4  B00002243X      Excellent, High Quality Starter Cables  I purchased the 12' feet long cable set and th...      5.0  A3ESWJPAVRPWB4    ...        [0, 0]   07 4, 2012     1341360000          2        415

Второй Dataframe - это группа всех prodcodes и отношения оценки настроения / всех отзывов, сделанных для этого продукта. Это соотношение для этой оценки обзора ко всем оценкам, сделанным для данного конкретного продукта.

df1 = (
    DFF.groupby(["prodcode", "sentiment"]).count()
    .join(DFF.groupby("prodcode").count(), "prodcode", rsuffix="_r"))[['reviewText', 'reviewText_r']]

df1['result'] = df1['reviewText']/df1['reviewText_r']
df1 = df1.reset_index()
df1 = df1.pivot("prodcode", 'sentiment', 'result').fillna(0)
df1 = round(df1 * 100)
df1.astype('int')

sorted_df2 = df1.sort_values(['0', '1', '2'], ascending=False)

, который производит следующий DF:

sentiment      0     1     2
prodcode                        
B0024E6QOO  80.0   0.0  20.0
B000GPV2QA  67.0  17.0  17.0
B0067DNSUI  67.0   0.0  33.0
B00192JH4S  62.0  12.0  25.0
B0087FSA0C  60.0  20.0  20.0
B0002KM5L0  60.0   0.0  40.0
B000DZBP60  60.0   0.0  40.0
B000PJCBOE  60.0   0.0  40.0
B0033A5PPO  57.0  29.0  14.0
B003POL69C  57.0  14.0  29.0
B0002Z9L8K  56.0  31.0  12.0

То, что я сейчас пытаюсь сделать, фильтрует мой первый кадр данных двумя способами. Первый, по результатам второго фрейма данных. Под этим я подразумеваю, что я хочу, чтобы первый кадр данных был отфильтрован с помощью продкода от второго кадра данных, где df1.sentiment ['0']> 40. Из этого списка я хочу отфильтровать первый кадр данных по тем строкам, в которых 'сентимент' с первого кадра данных = 0.

На высоком уровне я пытаюсь получить prodcode, summaryText и reviewText в первом кадре данных для продуктов, которые имеют высокие коэффициенты в более низких оценках настроения и настроение которых равно 0.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Я понял это:

DF3 = pd.merge(DFF, df1, left_on='prodcode', right_on='prodcode')
print(DF3.loc[(DF3['0'] > 50.0) & (DF3['2'] < 50.0) & (DF3['sentiment'].isin(['0']))].sort_values('0', ascending=False))
0 голосов
/ 26 апреля 2019

Примерно так:

при условии, что все необходимые данные находятся в df1, и слияния не требуется.

m = list(DFF['prodcode'].loc[DFF['sentiment'] == 0] # create a list matching your criteria
df.loc[(df['0'] > 40) & (df['sentiment'].isin(m)] # filter according to your conditions 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...