我在这里看到过很多类似的问题,但没有一个适用于我需要解决的情况。碰巧我有一个products
系列,其中"future"列的名称以字符串[edit]
结尾,并与将要加入其中的值混合在一起。像这样:
Index Values
0 Soda [edit]
1 Coke
2 Sprite
3 Ice Cream [edit]
4 Nestle
5 Snacks [edit]
6 Lays
7 Act II
8 Nachos
我需要把它变成一个 df,以获得这样的 sth:
Soda Ice Cream Snacks
0 Coke Nestle Lays
1 Sprite NaN Act II
2 NaN NaN Nachos
我制作了一个名为cols_index
的系列,它保存了列的索引,如第一个系列:
Index Values
0 Soda [edit]
3 Ice Cream [edit]
5 Snacks [edit]
但是,从这里我不知道如何将值传递给列。由于我是熊猫的新手,我认为使用for
循环生成范围进行迭代,该范围将引用元素的索引([1,2], [4], [6:8]
(,但这不是一种可推移的方式。
我该怎么做?提前谢谢。
====
=============================================================编辑:我解决了它,这是我是如何做到的。
在与同事一起审查了这个问题后,我们得出结论,没有可行的方法可以做到这一点,因此,我不得不将数据用作列表并应用for
和if
循环:
products = pd.read_csv("products_file.txt", delimiter='n', header = None, squeeze = True)
product_list = products.values.tolist()
cols = products[products.str.contains('[edit]', case = False)].values.tolist() # List of elements to be columns
df = []
category = product_list[0]
for item in product_list:
if item in cols:
category = item[:-6] # Removes '[edit]'
else:
df.append((category, item))
df = pd.DataFrame(df, columns = ['Category', 'Product'])
我们确实isin
找到列名,然后用cumsum
和cumcount
创建枢轴键,然后执行crosstab
s=df1.Values.isin(df2.Values)
df=pd.crosstab(index=s.cumsum(),
columns=s.groupby(s.cumsum()).cumcount(),
values=df1.Values,
aggfunc='first').set_index(0).T
0 Soda IceCream Snacks
col_0
1 Coke Nestle Lays
2 Sprite NaN ActII
3 NaN NaN Nachos