熊猫数据框列标题为数据标签

时间:2019-09-09 15:31:57

标签: python python-3.x pandas csv dataframe

摘要::我的代码输出为我提供了以下格式的数据框。数据框的列标题是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显示空白单元格为空白(''' '): enter image description here

Content是文本所在的列,ABCDE是需要转换为标签的列标题。仅具有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   

3 个答案:

答案 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}},以创建一个类似于原始数据帧的结构,并添加了一些适用于不同数据类型的故障安全代码(代码下方的两行)熔融方法)。如果了解更多有关如何实际表示缺失值的信息,则可以简化代码。