我想将一个由一系列元素组成的pandas列分解为多个列,因为它们具有唯一的元素,即one-hot-encode
它们(其值1
表示存在于行0
中的给定元素,在缺少的情况下).
例如,采用数据帧df
Col1 Col2 Col3
C 33 [Apple, Orange, Banana]
A 2.5 [Apple, Grape]
B 42 [Banana]
Run Code Online (Sandbox Code Playgroud)
我想将其转换为:
DF
Col1 Col2 Apple Orange Banana Grape
C 33 1 1 1 0
A 2.5 1 0 0 1
B 42 0 0 1 0
Run Code Online (Sandbox Code Playgroud)
我如何使用pandas/sklearn来实现这一目标?
假设我有一个numpy数组的形式:
arr=numpy.array([[1,1,0],[1,1,0],[0,0,1],[0,0,0]])
Run Code Online (Sandbox Code Playgroud)
我想找到值为非零的第一个索引(对于每一列)的索引.
所以在这个例子中,我希望返回以下内容:
[0,0,2]
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
对于一个项目,我希望能够创建一个包含一些特定符号串的推文数据集.因为我还要去早的时间有可能,我尝试使用GetOldTweets脚本(https://github.com/Jefferson-Henrique/GetOldTweets-python这里提到):/sf/answers/2455454431/.
问题是,它无法提取包含符号作为输入的推文.实际上,人们甚至无法直接在Twitter上搜索包含所需符号的任何推文.
为了更清楚地解释问题,请考虑以下示例案例.我想提取包含字符串'!!!'的所有推文 在过去两年内.
最好的方法是什么(如果这是可行的)?
我有一个表格的数据框,df:
cat_var_1 cat_var_2 num_var_1
0 Orange Monkey 34
1 Banana Cat 56
2 Orange Dog 22
3 Banana Monkey 6
..
Run Code Online (Sandbox Code Playgroud)
假设数据集中cat_var_1的可能值具有比率 - ['Orange':0.6,'Banana':0.4]并且cat_var_2的可能值具有比率['Monkey':0.2,'Cat':0.7,'Dog ':0.1].
如何将数据拆分为训练集,测试集和验证集(60:20:20分割),以保持分类变量的比例?实际上,这些变量可以是任意数量,而不仅仅是两个.而且,显然,在实践中可能永远不会达到确切的比例,但我们希望它尽可能接近.
我已经研究了这里描述的sklearn中的StratifiedKFold方法:如何将数据集拆分为类之间的训练和验证集保持比率?但这仅限于仅根据一个分类变量进行评估.
此外,如果您能提供所实现解决方案的复杂性,我将不胜感激.
我有一个pandas数据帧(想想是否作为网络中节点的加权邻接矩阵)的形式,df,
A B C D
A 0 0.5 0.5 0
B 1 0 0 0
C 0.8 0 0 0.2
D 0 0 1 0
Run Code Online (Sandbox Code Playgroud)
我想获得一个代表边缘列表的数据帧.对于上面的例子,我需要一些形式,edge_list_df,
Source Target Weight
0 A B 0.5
1 A C 0.5
2 A D 0
3 B A 1
4 B C 0
5 B D 0
6 C A 0.8
7 C B 0
8 C D 0.2
9 D A 0
10 D B 0
11 D C …
Run Code Online (Sandbox Code Playgroud) 假设我有一个值列表,
lst=['orange','apple','banana', 'grape', 'lemon']
Run Code Online (Sandbox Code Playgroud)
我还有一个表格的pandas数据框df
:
Source Destination Weight
orange apple 0.4
banana orange 0.67
grape lemon 0.1
grape banana 0.5
Run Code Online (Sandbox Code Playgroud)
行是lst中所有成对组合的子集.请注意,每个组合最多只出现一次.
我想要的是一个新的数据帧,其余的组合用值0填充.
例如,new_df
:
Source Destination Weight
orange apple 0.4
banana orange 0.67
grape lemon 0.1
grape banana 0.5
orange grape 0.0
orange lemon 0.0
banana lemon 0.0
Run Code Online (Sandbox Code Playgroud)
订单没有任何区别.
什么是快速的方法呢?
我有一个以下形式的 pandas 数据框df,
A B C D
A 0 0.5 0.5 0
B 1 0 0 0
C 0.8 0 0 0.2
D 0 0 1 0
Run Code Online (Sandbox Code Playgroud)
我正在尝试由此创建一个 networkx 图。我尝试过以下代码变体:
A)
G=networkx.from_pandas_adjacency(df)
G=networkx.DiGraph(G)
Run Code Online (Sandbox Code Playgroud)
二)
G=networkx.from_pandas_adjacency(df, create_using=networkx.DiGraph())
Run Code Online (Sandbox Code Playgroud)
然而,最终发生的情况是图形对象:
(对于选项 A)基本上只是取任意两个给定节点之间的两条平行边之间的值之一,并删除另一个值。
(对于选项 B)将任意两个给定节点之间的两条平行边中的值之一作为两条边的值。
例如,
print( list ( filter ( lambda x: x[0]=='A' and x[1] == 'B', list(G.edges.data()) ) ) )
Run Code Online (Sandbox Code Playgroud)
和
print( list ( filter ( lambda x: x[0]=='B' and x[1] == 'A', list(G.edges.data()) ) ) …
Run Code Online (Sandbox Code Playgroud) 我有以下两种形式的清单:
lst1 = [(1.2, 4), (5, 8), (19, 21), (24.5, 26)]
lst2 = [(1, 3), (6.55, 14.871), (22, 23)]
Run Code Online (Sandbox Code Playgroud)
我想要得到的输出是:
output = [(1.2, 3), (6.55, 8)]
Run Code Online (Sandbox Code Playgroud)
基本上,我想要两个列表中元组定义的范围之间的交集。
您可以假设-
给定列表中要排序的索引。例如,在lst2中:
1 < 6.55 < 22
Run Code Online (Sandbox Code Playgroud)有效范围(在一个元组中,startVal <= endEndVal)。在lst2中:
1 < 3 and 6.55 < 14.871 and 22 < 23
Run Code Online (Sandbox Code Playgroud)什么是实现此目标的有效方法?
我有一个形式的熊猫数据帧(df) -
Col1
A [Green,Red,Purple]
B [Red, Yellow, Blue]
C [Brown, Green, Yellow, Blue]
Run Code Online (Sandbox Code Playgroud)
我需要将其转换为边缘列表,即表单的数据框:
Source Target Weight
A B 1
A C 1
B C 2
Run Code Online (Sandbox Code Playgroud)
编辑 请注意,新数据框的行数等于可能的成对组合的总数.此外,要计算"权重"列,我们只需找到两个列表之间的交集.例如,对于B&C,元素共享两种颜色:蓝色和黄色.因此,相应行的"权重"为2.
最快的方法是什么?原始数据框包含大约28,000个元素.
我有一个df形式的熊猫数据框,
Batch_ID Product_ID
1 A
1 B
1 C
2 B
2 B
2 C
2 C
3 B
3 B
3 C
4 C
4 D
5 D
Run Code Online (Sandbox Code Playgroud)
我想从中获得一个边缘列表,本质上是一个新的数据帧edge_list_df(然后我不能将其转换为 networkx 对象),
Source Target Weight
A B 1.0
A C 1.0
A D 0.0
B C 3.0
B D 0.0
C D 1.0
Run Code Online (Sandbox Code Playgroud)
请注意,我在示例中给出了许多不同的可能性,以确保我的问题清楚。例如,即使 Batch_ID=2 BC 组合出现两次,计数器也不会增加两次。
实现这一目标的最有效方法是什么?
我想阻止某些短语进入我的模型.例如,我想防止"红玫瑰"进入我的分析.我理解如何通过这样做添加单词添加到scikit-learn的CountVectorizer的停止列表中给出的单个停用词:
from sklearn.feature_extraction import text
additional_stop_words=['red','roses']
Run Code Online (Sandbox Code Playgroud)
然而,这也导致其他ngrams,如"红色郁金香"或"蓝玫瑰"未被检测到.
我正在构建一个TfidfVectorizer作为我的模型的一部分,我意识到我需要的处理可能必须在这个阶段之后输入,但我不知道如何做到这一点.
我最终的目标是在一段文字上进行主题建模.以下是我正在处理的代码片段(几乎直接来自https://de.dariah.eu/tatom/topic_model_python.html#index-0):
from sklearn import decomposition
from sklearn.feature_extraction import text
additional_stop_words = ['red', 'roses']
sw = text.ENGLISH_STOP_WORDS.union(additional_stop_words)
mod_vectorizer = text.TfidfVectorizer(
ngram_range=(2,3),
stop_words=sw,
norm='l2',
min_df=5
)
dtm = mod_vectorizer.fit_transform(df[col]).toarray()
vocab = np.array(mod_vectorizer.get_feature_names())
num_topics = 5
num_top_words = 5
m_clf = decomposition.LatentDirichletAllocation(
n_topics=num_topics,
random_state=1
)
doctopic = m_clf.fit_transform(dtm)
topic_words = []
for topic in m_clf.components_:
word_idx = np.argsort(topic)[::-1][0:num_top_words]
topic_words.append([vocab[i] for i in word_idx])
doctopic = doctopic / np.sum(doctopic, axis=1, keepdims=True)
for …
Run Code Online (Sandbox Code Playgroud) 我有一个格式如下的 JSON 文件(存储在 PATH 中):
{"key1":[{"col1": "1", "col2": "first", "col3": "1", "col4": "a"}, {"col1": "1", "col2": "first", "col3": "2", "col4": "b"}, {"col1": "1", "col2": "first", "col3": "3", "col4": "c"}, {"col1": "2", "col2": "second", "col3": "1", "col4": "d"}], "key2":[], "key3": {} }
Run Code Online (Sandbox Code Playgroud)
我想从 key1 的值创建一个数据帧df,如下所示:
col1 col2 col3 col4
1 first 1 a
1 first 2 b
1 first 1 c
1 second 1 d
Run Code Online (Sandbox Code Playgroud)
现在,我编写了以下单行代码来处理这种情况:
pd.DataFrame(pd.read_json(PATH, orient='index').T['key1'].to_dict()).T
Run Code Online (Sandbox Code Playgroud)
我意识到我可能会做很多不必要的操作来获得所需的数据结构,并想知道是否有更有效的方法来实现这一目标?
额外的:
虽然肯定不是主要问题,但我想知道是否有一种方法可以处理我有一个附加键的值不是集合的情况(假设在上面的 JSON 中我们也有 "key4": "hello" )。目前,我的代码无法处理这种情况,因为这里不能直接应用 Pandas 操作。如果这涉及大量额外的预处理,那么如果不处理这种情况也没关系。
我有一个 Pandas 数据框df的形式:
id start_time end_time label
1 0 2 A
1 3 6 C
1 9 11 A
2 0 4 B
2 5 7 A
3 1 10 C
3 20 22 A
3 22.5 24 A
Run Code Online (Sandbox Code Playgroud)
我想根据end_time(当前行)- start_time(上一行)<=阈值的条件对列 id 进行分组,然后在新数据框中获取相应的时间和标签作为列表。实际上,对于阈值= 2,转换df后的新数据帧应如下所示:
id times labels
1 [(0,2), (3,6)] [A, C]
1 [(9,11)] [A]
2 [(0,4), (5,7)] [B, A]
3 [(1,10)] [C]
3 [(20,22), …
Run Code Online (Sandbox Code Playgroud) python ×13
pandas ×10
numpy ×8
scikit-learn ×3
dataframe ×2
networkx ×2
data-mining ×1
json ×1
nlp ×1
twitter ×1
web-scraping ×1