[英]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.