摘要::我的代码输出为我提供了以下格式的数据框。数据框的列标题是Content
列中文本的标签。标签将在下一步中用作多标签分类器的训练数据。这是实际数据的一小段。
由于它们是列标题,因此无法将其作为映射到它们所用作标签的文本使用。
Content A B C D E
zxy 1 2 1
wvu 1 2 1
tsr 1 2 2
qpo 1 1 1
nml 2 2
kji 1 1 2
hgf 1 2
edc 1 2 1
更新:将df转换为csv显示空白单元格为空白(''
与' '
):
Content
是文本所在的列,A
,B
,C
,D
和E
是需要转换为标签的列标题。仅具有1s或2s的列是相关的。空单元格的列不相关,因此不需要转换为标签。
更新:经过一些挖掘后,数字可能不是整数,而是字符串。
我知道在将文本+标签输入到分类器中进行处理时,两个数组的长度必须相等,否则将不被接受为有效输入。
是否可以将列标题转换为DF中Content
中文本的标签?
期望的输出:
>>Content A B C D E Labels
0 zxy 1 2 1 A, B, D
1 wvu 1 2 1 A, C, D
2 tsr 1 2 2 A, B, E
3 qpo 1 1 1 B, C, D
4 nml 2 2 C, D
5 kji 1 1 2 A, C, E
6 hgf 1 2 C, E
7 edc 1 2 1 A, B, D
答案 0 :(得分:2)
# first: clear all whitespace before and after a char, fine for all columns
for col in df.columns:
df[col] = df[col].str.strip()
# fill na with 0
df.fillna(0, inplace=True)
# replace '' with 0
df.replace('', 0, inplace=True)
# convert to int, this must only be done on the specific columns with the numeric data
# this list is the column names as you've presented them, if they are different in the real data,
# replace them
for col in ['A', 'B', 'C', 'D', 'E']:
df = df.astype({col: 'int16'})
print(df.info())
# you should end up with something like this.
"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8 entries, 0 to 7
Data columns (total 6 columns):
Content 8 non-null object
A 8 non-null int16
B 8 non-null int16
C 8 non-null int16
D 8 non-null int16
E 8 non-null int16
dtypes: int16(5), object(1)
memory usage: 272.0+ bytes
"""
我们可以做dot
,注意这里,我将空格视为np.nan
,如果这是您数据中的真实空格,请更改最后一行
# make certain the label names match the appropriate columns
s=df.loc[:, ['A', 'B', 'C', 'D', 'E']]
# or
s=df.loc[:,'A':]
df['Labels']=(s>0).dot(s.columns+',').str[:-1] # column A:E need to be numeric, not str
# df['Labels']=(~s.isin(['']).dot(s.columns+',').str[:-1]
答案 1 :(得分:2)
这是使用template<class T>
struct C
{
C(T *t) : t(t) {}
T *operator->()
{
cv.wait(lck);
return t;
// notify_one when function has completed
}
T *t;
std::condition_variable cv;
std::unique_lock<std::mutex> lck;
};
和np.where
的另一种方式:
groupby
输出:
r, c = np.where(df>0)
df['Labels'] = pd.Series(df.columns[c], index=df.index[r]).groupby(level=[0, 1]).agg(', '.join)
答案 2 :(得分:0)
您还可以按照以下步骤进行操作:
# melt the two dimensional representation to
# a more or less onedimensional representation
df_flat= df.melt(id_vars=['Content'])
# filter out all rows which belong to empty cells
# the following is a fail-safe method, that should
# work for all datatypes you might encouter in your
# columns
df_flat= df_flat[~df_flat['value'].isna() & df_flat['value'] != 0]
df_flat= df_flat[~df_flat['value'].astype('str').str.strip().isin(['', 'nan'])]
# join the variables used per original row
df_flat.groupby(['Content']).agg({'variable': lambda ser: ', '.join(ser)})
输出看起来像这样:
variable
idx Content
0 zxy A, B, D
1 wvu A, C, D
2 tsr A, B, E
3 qpo B, C, D
4 nml C, D
5 kji A, C, E
6 hgf C, E
7 edc A, B, D
给出以下输入数据:
import pandas as pd
import io
raw="""idx Content A B C D E
0 zxy 1 2 1
1 wvu 1 2 1
2 tsr 1 2 2
3 qpo 1 1 1
4 nml 2 2
5 kji 1 1 2
6 hgf 1 2
7 edc 1 2 1 """
df= pd.read_fwf(io.StringIO(raw))
df.drop(['idx'], axis='columns', inplace=True)
编辑:我刚读完'idx'
之后就删除了{{1}},以创建一个类似于原始数据帧的结构,并添加了一些适用于不同数据类型的故障安全代码(代码下方的两行)熔融方法)。如果了解更多有关如何实际表示缺失值的信息,则可以简化代码。