根据其他列

时间:2016-06-01 09:27:39

标签: python numpy pandas

我有一个像:

products                  price 
abc|abc|abc|abc|abc       1|2|10|20|30
abc|abc|deg|              3|8|5
abc|abc|abc|abc|abc|abc   10|11|12|13|14|15|16|17|18

解释:每一行都是顾客购买的篮子。               例如,所有产品都以'|'分隔               第一个客户(行)花了63美元买了5个产品。 通常,行包含相同数量的“|”。

但正如您所看到的,在最后一排,有6种产品和9种价格。 问题来自256 char的限制,所以有些产品不保存在文件中,但是我们购买的产品都有价格(当然如果柱价不超过256 CHAR!)

我想把价格带到'|'的最大值在列产品上获得如下的df:

   products                  price 
abc|abc|abc|abc|abc       1|2|10|20|30
abc|abc|deg|              3|8|5
abc|abc|abc|abc|abc|abc   10|11|12|13|14|15

我试试这个:

def count_fx(s):
return s.count('|')

max_prod = max(df['products'].apply(count_fx))

df.ix[np.logical_and(df.products.str.len()==255), ['products']]= df['products'].str.rpartition('|',max_prod)[0]

但它不起作用。

你知道任何解决方案吗?

由于

1 个答案:

答案 0 :(得分:0)

使用str.split('|', expand=True)在价格上创建一个掩码然后重新组合:

have_products = df.products.str.split('|', expand=True).notnull()

get_price = df.price.str.split('|', expand=True)[have_p]
df.price = get_price.apply(lambda x: '|'.join(x.dropna().astype(str)), axis=1)

print df

                  products              price
0      abc|abc|abc|abc|abc       1|2|10|20|30
1             abc|abc|deg|              3|8|5
2  abc|abc|abc|abc|abc|abc  10|11|12|13|14|15
相关问题