我正在尝试从以下列表构建数据框:
A = ['item 1', 'item 2', 'item 3', 'item 4', 'item 5']
B = ['item 2','item 4']
C = ['item 1', 'item 5']
我希望列表名称(或该名称的某种表示形式)为相应的值,例如:
dA = [{'item':x, 'A':True} for x in A]
dB = [{'item':x, 'B':True} for x in B]
dC = [{'item':x, 'C':True} for x in C]
当前,我正在使用一些难看的方法来构建数据框。我最喜欢这里的最佳做法解决方案:
dfA = pd.DataFrame.from_records(dA)
dfB = pd.DataFrame.from_records(dB)
dfC = pd.DataFrame.from_records(dC)
df = pd.merge(dfA,dfB, 'outer').merge(dfC,'outer').fillna(False)
# Result:
item A B C
0 item 1 True False True
1 item 2 True True False
2 item 3 True False False
3 item 4 True True False
4 item 5 True False True
答案 0 :(得分:2)
另一种无需合并的方法
import pandas as pd
# list all unique items (in case there are not all present in A)
all_items = list(set(A+ B+C))
# create a dataframe with only item column
df = pd.DataFrame({'item':all_items})
# add boolean columns
df['A'] = df['item'].isin(A)
df['B'] = df['item'].isin(B)
df['C'] = df['item'].isin(C)
# item A B C
#0 item 4 True True False
#1 item 3 True False False
#2 item 2 True True False
#3 item 1 True False True
#4 item 5 True False True
如果您想要更漂亮的东西或者要创建更多的列,也可以使用字典
dict_list = {'A': A, 'B': B, 'C':C}
for col in dict_list.keys():
df[col] = df['item'].isin(dict_list[col])
答案 1 :(得分:1)
您可以使用pandas.get_dummies:
import pandas as pd
A = ['item 1', 'item 2', 'item 3', 'item 4', 'item 5']
B = ['item 2', 'item 4']
C = ['item 1', 'item 5']
# generate series
s = pd.Series({'A': A, 'B': B, 'C': C})
# apply get dummies and transform
result = pd.get_dummies(s.apply(pd.Series).stack()).sum(level=0).T
print(result)
输出
A B C
item 1 1 0 1
item 2 1 1 0
item 3 1 0 0
item 4 1 1 0
item 5 1 0 1
如果必须具有布尔值,则可以执行以下操作:
result = pd.get_dummies(s.apply(pd.Series).stack()).sum(level=0).T.astype(bool)
答案 2 :(得分:1)
尝试pd.crosstab
arr = np.concatenate([A, B, C])
col_arr = np.repeat(['A', 'B', 'C'], [len(A), len(B), len(C)])
pd.crosstab(index=arr, columns=col_arr)
Out[106]:
col_0 A B C
row_0
item 1 1 0 1
item 2 1 1 0
item 3 1 0 0
item 4 1 1 0
item 5 1 0 1
如果您想要True/False
,只需将另一个eq(1)
链接起来
pd.crosstab(index=arr, columns=col_arr).eq(1)
Out[108]:
col_0 A B C
row_0
item 1 True False True
item 2 True True False
item 3 True False False
item 4 True True False
item 5 True False True