我在数据框中有两列,一列称为“ Subreddits”,其中列出了字符串值,一列称为“ Appearances”,其中列出了它们出现的次数。 当它检测到数据框中已经存在的字符串值时,我试图在“外观”列中的某行的值上加1。
df = pd.read_csv(Location)
print(len(elem))
while counter < 50:
#gets just the subreddit name
e = str(elem[counter].get_attribute("href"))
e = e.replace("https://www.reddit.com/r/", "")
e = e[:-1]
inDf = None
if (any(df.Subreddit == e)):
print("Y")
inDf = True
if inDf:
#adds 1 to the value of Appearances
#df.set_value(e, 'Appearances', 2, takeable=False)
#df.at[e, 'Appearances'] +=1
else:
#adds new row with the subreddit name and sets the amount of appearances to 1.
df = df.append({'Subreddit': e, 'Appearances': 1}, ignore_index=True)
print(e)
counter = counter + 2
print(df)
唯一给我带来麻烦的部分是if inDF
部分。我不知道如何在subreddit的“外观”中添加1。
答案 0 :(得分:0)
您可以使用df.loc[df['Subreddits'] == e, 'Appearances'] += 1
示例:
df = pd.DataFrame(columns=['Subreddits', 'Appearances'])
e_list = ['a', 'b', 'a', 'a', 'b', 'c']
for e in e_list:
inDF = (df['Subreddits'] == e).sum() > 0
if inDF:
df.loc[df['Subreddits'] == e, 'Appearances'] += 1
else:
df = df.append([{'Subreddits': e, 'Appearances': 1}])
df.reset_index(inplace=True, drop=True) # good idea to reset the index..
print(df)
Subreddits Appearances
0 a 3
1 b 2
2 c 1
答案 1 :(得分:0)
这里的逻辑有点混乱,您不需要对inDF
的3个引用,也不需要使用None
对其进行实例化,也不需要将内置any
与{ {1}}个对象。
您可以通过pd.Series
运算符检查该值是否存在于序列中:
in
更好的是,在循环中使用if e in df['Subreddit'].values:
df.loc[df['Subreddit'] == e, 'Appearances'] += 1
else:
df = df.append({'Subreddit': e, 'Appearances': 1}, ignore_index=True)
,并在过程结束时创建数据框。不建议您当前使用defaultdict
,因为每一行都会重复执行昂贵的操作。
pd.DataFrame.append