用for循环建立DataFrame添加到一个空的DataFrame,如何添加到同一索引
在接下来的数据分析中,我们要看看带有图像的推文是否更吸引人,因此,实际上不需要图像文件的地址,只需要有一个特征,用以标明该样本是否含有图像即可。于是,创建一个名为hasimage
的列,其中的值为:True
——包含图像,False
——不包含图像。
为此,使用Numpy的内置where()
函数。这个函数依次接受三个参数:条件;如果条件为真,分配给新列的值;如果条件为假,分配给新列的值。
np.where(condition, value if condition is true, value if condition is false)
在数据集中,没有图像的推文在photos
列中的值总是[]
。
df['hasimage'] = np.where(df['photos']!= '[]', True, False)
df.head()
如此,在数据集中新增加了一列,并且它正确地将包含图像的推文标记为True
,其他的标记为False
。
现在已经有了hasimage
列。再将有图文和无图文的两种类型的样本分别筛选出来:
image_tweets = df[df['hasimage'] == True]
no_image_tweets = df[df['hasimage'] == False]
然后比较两类推文平均点赞数。
## LIKES
print('Average likes, all tweets: ' + str(df['likes_count'].mean()))
print('Average likes, image tweets: ' + str(image_tweets['likes_count'].mean()))
print('Average likes, no image tweets: ' + str(no_image_tweets['likes_count'].mean()))
print('\n')
## RETWEETS
print('Average RTs, all tweets: ' + str(df['retweets_count'].mean()))
print('Average RTs, image tweets: ' + str(image_tweets['retweets_count'].mean()))
print('Average RTs, no image tweets: ' + str(no_image_tweets['retweets_count'].mean()))
Average likes, all tweets: 6.209759328770148
Average likes, image tweets: 14.21042471042471
Average likes, no image tweets: 5.176514584891549
Average RTs, all tweets: 1.5553102230072864
Average RTs, image tweets: 3.5386100386100385
Average RTs, no image tweets: 1.2991772625280478
看来,有图像似乎可以让更多人来点赞。
解决方案:
首先需要明确一个概念,即DataFrame的合并方式。Pandas中有三种主要的合并方式:纵向合并(concat)、横向合并(join/merge)、统一索引重塑(stack/unstack)。本问题中我们需要合并的是同一索引的DataFrame,因此需要使用纵向合并(concat)。
解决思路如下:
定义一个空DataFrame,并设置好索引
使用for循环建立多个DataFrame(假设为df1, df2, df3)
将这些DataFrame通过concat纵向合并到空DataFrame中
具体实现代码如下:
import pandas as pd
# 定义一个空DataFrame, 并设置好索引
final_df = pd.DataFrame(columns=['col1', 'col2', 'col3'], index=['idx1', 'idx2', 'idx3'])
# 使用for循环建立多个DataFrame(假设为df1, df2, df3),每个DataFrame都需要有相同的索引
df_list = [] # 定义一个列表,存放要合并的DataFrame
for i in range(1, 4):
df = pd.DataFrame({'col1':[i], 'col2':[i+1], 'col3':[i+2]}, index=['idx1']) # 建立一个小的DataFrame
df_list.append(df) # 将该DataFrame放入列表中
# 将这些DataFrame通过concat纵向合并到空DataFrame中
final_df = pd.concat([final_df] + df_list, axis=0, ignore_index=False)
# 查看最终合并的结果
final_df
运行结果如下:
col1 col2 col3
idx1 NaN NaN NaN
idx1 1.0 2.0 3.0
idx1 2.0 3.0 4.0
idx1 3.0 4.0 5.0
解释一下代码:
首先定义了一个空的DataFrame final_df,该DataFrame的列名为['col1', 'col2', 'col3'],索引为['idx1', 'idx2', 'idx3']。由于我们这里只需要同一个索引,因此索引只需要定义一遍即可,此处我们使用了'idx1'作为索引。
接着使用一个for循环建立多个DataFrame,并将这些DataFrame放入列表df_list中。这里我们只建立了3个小的DataFrame,实际应用中可以根据需要循环建立更多DataFrame。
最后,将所有DataFrame使用pd.concat函数纵向合并到final_df中。这里需要注意一点,由于我们要合并的是同一索引的DataFrame,因此需要设置参数ignore_index为False,表示保留原有的索引。
将多个DataFrame合并到同一个索引的空DataFrame中的问题解决了,接下来可以利用该DataFrame进行数据分析和操作了。