繁体   English   中英

与 dataframe 中的值对应的定位列

[英]Locating column that correspond to a value in a dataframe

假设我有一个定义 dataframe

+---+----+-------+-------+--------+
|ID |Fear |Happy |Angry  |Excited |              
+---+-----+------+-------+--------+
|   |     |      |       |        |
+---+-----+------+-------+--------+

我使用 NRCEx 对文本进行了情感分析。 假设它返回

text_emotion = [Fear, Happy]

如何定位列表中的值并将其放入相应的列,如果存在则为 1,如果不存在则为 0

+---+----+-------+-------+--------+
|ID |Fear |Happy |Angry  |Excited |              
+---+-----+------+-------+--------+
| A |1    |0     |0      |0       |
+---+-----+------+-------+--------+

我尝试使用get_dummies 但是它不适用于我的情况,因为我希望它对应于定义的 dataframe。 它给了我这个:

+---+----+-------+
|ID |Fear |Happy |             
+---+-----+------+
| A | 1   | 1    | 
+---+-----+------+

我会很感激任何帮助。 谢谢你

您可以执行以下操作:

frame = pd.DataFrame(columns = ["Fear", "Angry", "Happy", "Excited"])
mylist = ["Fear", "Happy"]
pattern = '|'.join(mylist)
row = frame.columns.str.contains(pattern).astype(int)
frame.loc[0] = row

如果你有一个完整的列表,你可以使用frame.loc[i]遍历 append 每一行到 dataframe 。 像这样:

frame = pd.DataFrame(columns = ["Fear", "Angry", "Happy", "Excited"])
mylist = frame.columns
mylists = [["Fear", "Happy"], ["Angry", "Excited"]]
for i in range(len(mylists)):
    the_list = mylists[i]
    pattern = '|'.join(the_list)
    row = frame.columns.str.contains(pattern).astype(int)
    frame.loc[i] = row

这取决于您如何表示数据。 假设您根据情绪分析结果构建了以下 dataframe:

df = pd.DataFrame({
    'A':['Fear', 'Happy', 'Emotional'], 
    'B':['Excited', 'Emotional', 'Angry'], 
})

然后你可以这样做:

df_dummies = pd.get_dummies(df.T, prefix=['']*len(df.T.columns), prefix_sep='')
out = df_dummies.groupby(level=0, axis=1).sum()

打印出):

   Angry  Emotional  Excited  Fear  Happy
A      0          1        0     1      1
B      1          1        1     0      0

如果您希望索引作为单独的 ID,那么

out = out.rename_axis('ID').reset_index()

打印出):

  ID  Angry  Emotional  Excited  Fear  Happy
0  A      0          1        0     1      1
1  B      1          1        1     0      0

我以前从未听说过get_dummies() ,但这就是我想出的。 它还使用loc 这很好,因为您可以有一个预定义或未定义/空的 dataframe 并且它仍然可以工作。

由于text_emotion中的情绪与 dataframe 列名相同,因此您可以循环遍历text_emotion并使 dataframe 行/列值等于 1 和loc

import numpy as np
import pandas as pd

df = pd.DataFrame()

text_emotion_1 = ['Fear', 'Happy', 'Angry']
text_emotion_2 = ['Happy', 'Excited']

# for row 0, or you can do boolean indexing to assign it
# to the row where index = A
for em in text_emotion_1:
    df.loc[0, em] = 1

# for row 1
for em in text_emotion_2:
    df.loc[1, em] = 1

如果你从一个空的 dataframe 开始,你会有空值:

   Fear  Happy  Angry  Excited
0   1.0    1.0    1.0      NaN
1   NaN    1.0    NaN      1.0

因此,您可以使用fillna()astype()将空值替换为 0,并将所有内容分别转换为 integer。

df.fillna(0, inplace=True)
df = df.astype('int')

然后您的 dataframe 将如下所示(只是缺少索引列):

   Fear  Happy  Angry  Excited
0     1      1      1        0
1     0      1      0        1

编辑:删除了一个杂散的逗号

假设您有一个像这样的基础 dataframe df (不需要有行)

df = pd.DataFrame([["A", 0, 0, 0, 1]], columns=["ID", "Fear", "Happy", "Angry", "Excited"])
  ID  Fear  Happy  Angry  Excited
0  A     0      0      0        1

并且您的分析数据组织在另一个 dataframe data_df ,例如

data_df = pd.DataFrame({"ID": ["B", "C"], "text_emotion": [["Happy"], ["Angry", "Fear"]]})
  ID   text_emotion
0  B        [Happy]
1  C  [Angry, Fear]

然后你可以使用.str.get_dummies() :这个

print(data_df["text_emotion"].str.join("|").str.get_dummies())

结果是

   Angry  Fear  Happy
0      0     0      1
1      1     1      0

所以当你把它连接到df

df_new = pd.concat(
    [data_df["ID"], data_df["text_emotion"].str.join("|").str.get_dummies()], axis=1
)
df = pd.concat([df, df_new], ignore_index=True).fillna(0)

你会得到

  ID  Fear  Happy  Angry  Excited
0  A     0      0      0      1.0
1  B     0      1      0      0.0
2  C     1      0      1      0.0

这些列与df的列完全一样 要修复浮动部件,您可以这样做

df[df.columns[1:]] = df[df.columns[1:]].astype("int")

并得到

  ID  Fear  Happy  Angry  Excited
0  A     0      0      0        1
1  B     0      1      0        0
2  C     1      0      1        0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM