我的数据框(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
答案 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 indexing
,drop_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