在Pandas数据帧中使用字数来删除只有一个字的行

时间:2017-05-12 17:37:01

标签: python pandas dataframe

我有一个包含2条记录的数据框(数据):

id    text
0001  The farmer plants grain
0002  tuna

我想计算此数据框的text列中的字数,并只删除一个字。

我知道如何计算单词数量:

count = data['text'].str.split().str.len()

如何使用结果运行将丢弃数据帧中的行的IF语句?任何IF语句,如......

if count == 1:
    print('drop')

...导致此错误:

Traceback (most recent call last):

  File "<ipython-input-118-b3fcb0218e8e>", line 32, in <module>
    if count == 1:

  File "C:\Users\taca\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\generic.py", line 917, in __nonzero__
    .format(self.__class__.__name__))

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我已经阅读了关于此错误的Pandas文档和其他SO问题,但我似乎无法通过IF语句正确应用我的问题的解决方案。

非常感谢任何建议!由于我对SO比较陌生,请告诉我是否有什么可以改进我的问题。

4 个答案:

答案 0 :(得分:2)

我只是看看它是否有空格

 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSDictionary *body = @{@"search": self.searchBar.text};
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:body options:0 error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];


NSString *url = @"https://iosdevfitbody.herokuapp.com/fitbodylocations/search.json";

NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];

 [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];

[[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
    if (!error) {
        if ([responseObject isKindOfClass:[NSDictionary class]]) {
            self.results = [[NSMutableArray alloc] initWithArray:[responseObject objectForKey: @"message"]];
        }
    } else {
        NSLog(@"Error: %@, %@, %@", error, response, responseObject);
    }
}]resume];

或更一般地使用count

data = data[data.text.str.contains(' ')]
data

     id                     text
0  0001  The farmer plants grain

出了什么问题!

data = data[data.text.str.count(' ') > 0]
data

     id                     text
0  0001  The farmer plants grain

运行此结果会导致count = data['text'].str.split().str.len() 长度为count

pandas.Series

count == 1 真值。 pandas.Series毫无意义,因为它会尝试确定整个系列是否为if count == 1。它不是TrueTrue。您必须以不同方式使用它来实现目标。我提供了一种方法。 @StevenG也是如此。

答案 1 :(得分:1)

使用面具:

dropped = data[~(count==1)].copy()

说明:

所以假设这样的df有:

data = pd.DataFrame({'text': ['hello my name is','hey']})

使用你的count方法你可以检查它是否为1,创建一个布尔掩码:

count = data['text'].str.split().str.len()
~(count==1)
Out[18]: 
0     True
1    False
Name: text, dtype: bool

现在您可以应用该面具:

data[~(count==1)]
Out[22]: 
               text
0  hello my name is

答案 2 :(得分:0)

只需对数据帧使用条件参数即可。它会是这样的:

  

df = df [df ['column']。str.contains('')]

假设两个词之间有空格。

答案 3 :(得分:0)

回答可能很晚,但可以帮助新观众。
您可以轻松找到与所需行匹配的行索引,并将其从数据框中删除。

@classmethod
def create staff_user(cls, **kwargs):
    email = kwargs.pop('email')
    password = kwargs.pop('password')
    kwargs['published_date'] = timezone.now()
    kwargs['user'] = User.objects.create_user(
            email=email,
            password=password,
            is_staff=True,
            is_active=1
        )
    return cls.objects.create(**kwargs)