匹配数据框行中的值

时间:2017-03-27 12:33:20

标签: python pandas

我的数据框(df)如下所示:

name  type    cost
a     apples  1
b     apples  2
c     oranges 1 
d     banana  4
e     orange  6

除了使用2 for循环之外,有一种方法可以循环并比较列表中的每个名称和类型以及名称本身不是(A与A),类型相同(苹果与苹果)并且它不是同一对的重复,而是相反,例如如果我们有A vs B,我不希望看到B vs A,产生一个看起来的输出列表:

name1, name2, status
    a      b       0
    c      e       0

前两个元素是标准匹配的名称,第三个元素始终为0。

我试图用2 for循环(见下文)来做这件事,但如果我们已经有了一个vs b,我就不能拒绝说b对a。

def pairListCreator(staticData):
    for x, row1 in df.iterrows():

        name1 = row1['name']
        type1= row1['type']

        for y, row2 in df.iterrows():
            name2 = row['name']
            type2 = row['type']

            if name1<> name2 and  type1 = type2:
                pairList = name1,name2,0

2 个答案:

答案 0 :(得分:2)

像这样的东西

import pandas as pd

# Data
data = [['a', 'apples', 1],
        ['b', 'apples', 2],
        ['c', 'orange', 1],
        ['d', 'banana', 4],
        ['e', 'orange', 6]]

# Create Dataframe
df = pd.DataFrame(data, columns=['name', 'type', 'cost'])
df.set_index('name', inplace=True)

# Print DataFrame
print df

# Count number of rows
nr_of_rows = df.shape[0]

# Create result and compare
res_col_nam = ['name1', 'name2', 'status']
result = pd.DataFrame(columns=res_col_nam)

for i in range(nr_of_rows):
    x = df.iloc[i]

    for j in range(i + 1, nr_of_rows):
        y = df.iloc[j]

        if x['type'] == y['type']:
            temp = pd.DataFrame([[x.name, y.name, 0]], columns=res_col_nam)
            result = result.append(temp)

# Reset the index
result.reset_index(inplace=True)
result.drop('index', axis=1, inplace=True)

# Print result
print 'result:'
print result

输出:

        type  cost
name              
a     apples     1
b     apples     2
c     orange     1
d     banana     4
e     orange     6
result:
  name1 name2  status
0     a     b     0.0
1     c     e     0.0

答案 1 :(得分:1)

您可以先在type列上使用自我加入,然后按names每行apply(sorted)列中的值排序。

然后在boolean indexingdrop_duplicates中删除名称列中的相同值,并在assign之后添加新列status

df = pd.merge(df,df, on='type', suffixes=('1','2'))
names = ['name1','name2']
df[names] = df[names].apply(sorted, axis=1)
df = df[df.name1 != df.name2].drop_duplicates(subset=names)[names]
                             .assign(status=0)
                             .reset_index(drop=True)
print (df)
  name1 name2  status
0     a     b       0
1     c     e       0