【问题标题】:Case sensitive Pandas Series matching and clean Panda Series Logic区分大小写的 Pandas Series 匹配和干净的 Pandas Series Logic
【发布时间】:2017-10-09 18:49:42
【问题描述】:

我有一个 pandas 的水果数据框::

df = pd.read_csv(newfile, header=None)
df
             0        1        2             3        4        5    6   7
0        Apple  Bananas      Fig    Elderberry   Cherry    Honeydew NaN NaN 
1      Bananas   Cherry   Dragon    Elderberry      NaN         NaN NaN NaN
2       Cherry    Grape      NaN           NaN      NaN         NaN NaN NaN
3       Dragon      NaN    Apple        Bananas  Cherry  Elderberry NaN NaN
4   Elderberry    Apple  Bananas            Fig   Grape         NaN NaN NaN
5          Fig   Cherry Honeydew          Apple     NaN         NaN NaN NaN
6        Grape      NaN      NaN            NaN     NaN         NaN NaN NaN
7     Honeydew    Grape      Fig     Elderberry  Dragon      Cherry Bananas Apple    

我正在尝试寻找“水果配对”,例如第一排的苹果和无花果是一对,第六排的无花果和苹果是一对。同样适用于 Apple-Elderberry 和 Elderberry-Apple,但不是 Apple 和 Bananas(没有以 Bananas 开头的行中的 Apple)。

我有下面的代码工作,并且这样做::

fruits = df[0]
stock  = df.drop(0, axis=1)

for i in range(len(fruits)):
    string1 = str(fruits[i])
    full_line = (stock.iloc[i])
    line = np.array(full_line.dropna(axis=0))
    if len(line) > 0 : 
        for j in range(len(stock)):
            iind = (fruits[fruits == line[j]].index[0])
            this_line = stock.iloc[iind]
            logic_out = this_line.str.match(string1)
            print(logic_out)

但是!! (1) 由于 Pandas Series 区分大小写,它在结果 == line[j] 处中断,并且 (2) 布尔输出是 True、False 和 NaN 的混合。理想情况下,我只想计算 Trues。任何和所有的帮助非常感谢!

【问题讨论】:

    标签: python pandas logic series case-sensitive


    【解决方案1】:

    我将使用集合逻辑、pandas 堆叠和 numpy 广播

    f = lambda x: x.title() if isinstance(x, str) else x
    
    s = df.applymap(f).set_index('0').rename_axis(None).stack().groupby(level=0).apply(set)
    
    f = s.index
    p = s.values
    
    one_way = (p[:, None] & [{x} for x in f]).astype(bool)
    [(f[i], f[j]) for i, j in zip(*np.where(one_way & one_way.T))]
    
    [('Apple', 'Elderberry'),
     ('Apple', 'Fig'),
     ('Apple', 'Honeydew'),
     ('Bananas', 'Dragon'),
     ('Bananas', 'Elderberry'),
     ('Dragon', 'Bananas'),
     ('Elderberry', 'Apple'),
     ('Elderberry', 'Bananas'),
     ('Fig', 'Apple'),
     ('Fig', 'Honeydew'),
     ('Honeydew', 'Apple'),
     ('Honeydew', 'Fig')]
    

    【讨论】:

    • 嗨@piRSquared,这看起来很棒,但是在第一行崩溃了,并带有 KeyError: '0' 消息....我已经编辑了上面的代码以向您展示我的情况阅读 df 和 .cvs 如下。
    • 苹果,香蕉,无花果,接骨木,樱桃,蜜露,,香蕉,樱桃,龙,接骨木,,,,,樱桃,葡萄,,,,,,龙,,苹果,,香蕉,樱桃,接骨木,接骨木,苹果,香蕉,无花果,葡萄,,,无花果,樱桃,蜜露,苹果,,,,葡萄,,,,,,,,蜜露,葡萄,无花果,接骨木,龙,樱桃,香蕉,苹果
    • 第一列的实际名称是什么。我假设它是'0',因为这是在我复制并通过您提供的数据框时解析的内容。请稍后尝试我的更新。
    • 你好@piRSquared。同样,这真的很好,但它并没有解决我原来的问题。如果我对第一行执行“figs”(小写),那么 ('Apple', 'fig') 和 ('fig', 'Apple') 都不会返回。
    • @npross 我更新了帖子,我强制所有字符串为str.title,即大写首字母。您也可以使用str.upper 或str.lower。
    猜你喜欢
    • 2019-06-27
    • 2014-11-20
    • 2016-11-19
    • 2017-12-12
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多