字符串以特定文本开头

时间:2017-06-08 14:14:43

标签: python string pandas if-statement twitter

我正在尝试阅读csv文件,并且我已根据某些条件执行列操作。 它完全忽略了我的if条件并执行else语句。 经过多次故障排除后,我感到非常痛苦,我无法纠正它。

以下是代码:
推文是推文的专栏名称

inf = pd.read_csv('string.csv')
for r in inf : 
    if "RT @" in inf.Tweet :   
        inf["Engagements"] = 0  
    else : 
        inf["Engagements"] = inf["Favorite_Count"] + inf["Retweet_Count"]

inf.to_csv('string2.csv', index=False)

4 个答案:

答案 0 :(得分:2)

在使用数组的pandas中,所以需要numpy.where使用str.contains创建的布尔掩码,^开头string或使用str.startswith

inf["Engagements"] = np.where(inf["Tweet"].str.contains('^RT @'), 
                              0, 
                              inf["Favorite_Count"] + inf["Retweet_Count"])

样品:

inf["Engagements"] = np.where(inf["Tweet"].str.contains('^RT @'), 
                              0, 
                              inf["Favorite_Count"] + inf["Retweet_Count"])

print (inf)
   Favorite_Count  Retweet_Count     Tweet  Engagements
0               1              2  RT @ ddd            0
1               4              0        dd            4
2               5              7  dds RT @           12
inf["Engagements"] = np.where(inf["Tweet"].str.startswith('RT @'), 
                              0, 
                              inf["Favorite_Count"] + inf["Retweet_Count"])

print (inf)
   Favorite_Count  Retweet_Count     Tweet  Engagements
0               1              2  RT @ ddd            0
1               4              0        dd            4
2               5              7  dds RT @           12

答案 1 :(得分:1)

您可以先将Engagement列初始化为零。然后创建一个掩码,以查找不以开始的推文< RT' (注意~否定)。最后,使用掩码添加Favorite_CountRetweet_Count列。

请注意,您很少想要使用带数据框的循环。

inf = pd.read_csv('string.csv')

inf['Engagement'] = 0
mask = ~inf.Tweet.str.startswith('RT @')
inf.loc[mask, 'Engagement'] = (
    inf.loc[mask, 'Favorite_Count'] 
    + inf.loc[mask, 'Retweet_Count']
)

示例:

# Sample data.
inf = pd.DataFrame(
    {'Tweet': ["RT @ something", "something that doesn't start with RT @", "something else"],
     'Favorite_Count': [1, 2, 3], 
     'Retweet_Count': [3, 2, 1]})

# Apply code
inf['Engagement'] = 0
mask = ~inf.Tweet.str.startswith('RT @')
inf.loc[mask, 'Engagement'] = (
    inf.loc[mask, 'Favorite_Count'] 
    + inf.loc[mask, 'Retweet_Count']
)

>>> inf[['Favorite_Count', 'Retweet_Count', 'Engagement', 'Tweet']]
    Favorite_Count  Retweet_Count   Engagement  Tweet
0   1   3   0   RT @ something
1   2   2   4   something that doesn't start with RT @
2   3   1   4   something else

答案 2 :(得分:0)

除了上述简明的答案之外,如果您想使用类似的if else结构,您可以使用set_value来设置特定行和列的值。

import pandas as pd
inf = pd.read_csv('string.csv')
for index,row in inf.iterrows():
    if "RT @" in row["Tweet"]:
        inf.set_value(index, "Engagements", 0)
    else:
        inf.set_value(index, "Engagements", row["Favorite_Count"] + row["Retweet_Count"])
inf.to_csv('string2.csv', index=False)

答案 3 :(得分:-1)

if string.startswith(whateveritshouldstartwith):

这是实现此目的的正确方法。