python - 使用大数据框的行值创建迷你数据框 -Pandas
问题描述
我有一个pandas
从 Excel 文件中读取的数据框。由于 Excel 文件中的第 1 行具有重复值,例如245, 245, 245
,我将它们读为pd.read_excel(file, 'myfile', header = None)
,因此我可以防止熊猫创建标题245, 245.1, 245.2
等。
这是我的df
样子:
0 1 2 3 4
0 245 245 245 867 867
1 Reddit NaN NaN Facebook NaN
2 ColumnNeeded NaN ColumnValue ColumnNeeded ColumnValue
3 RedditInsight NaN C FacbookInsights A
4 RedditText NaN H FacbookText L
我需要这样的输出(needed_df
),
ID Company ColumnNeeded ColumnValue
0 245 Reddit RedditInsight C
1 245 Reddit RedditText H
2 867 Facebook FacbookInsight A
3 867 Facebook FacbookText L
不确定,如何在pandas
. 我试图从第 1 行中获取所有唯一值df
。
id_s = []
for i in df.iloc[0]:
id_s.append(i)
print(set(id_s))
unique_ids 列表'
unique_id = list(set(id_s))
print(unique_id )
>> [867,245]
然后我想遍历df's
第 1 行并在列表中找到所有匹配的值unique_id
,然后将它们拆分为单独的迷你数据帧。
我无法得到那份工作。我的想法是创建迷你数据框,迷你 df1 即:
0 1 2
0 245 245 245
1 Reddit NaN NaN
2 ColumnNeeded NaN ColumnValue
3 RedditInsight NaN C
4 RedditText NaN H
迷你df2:
0 1
0 867 867
1 Facebook NaN
2 ColumnNeeded ColumnValue
3 FacbookInsights A
4 FacbookText L
我正在考虑对这些迷你数据框进行操作(可能使用一个函数,因此我可以应用于所有迷你 dfs),最后将它们附加到一个大数据框。或者有没有其他想法或方法来获取我的输出数据框?
解决方案
您的 DataFrame 的创建如下所示:
import pandas as pd
import numpy as np
df = pd.DataFrame([[245,245,245,867,867], ['Reddit', np.nan, np.nan,'Facebook',np.nan], ['ColumnNeeded',np.nan, 'ColumnValue', 'ColumnNeeded','ColumnValue'],
['RedditInsight', np.nan, 'C', 'FacebookInsights', 'A'], ['RedditText', np.nan, 'H', 'FacbookText', 'L']])
您的 DataFrame 如下所示:
0 1 2 3 4
0 245 245.0 245 867 867
1 Reddit NaN NaN Facebook NaN
2 ColumnNeeded NaN ColumnValue ColumnNeeded ColumnValue
3 RedditInsight NaN C FacebookInsights A
4 RedditText NaN H FacbookText L
现在是代码。
new_header = df.iloc[0] #Grab the first row for the header
df = df[1:] #Take the data less the header row
df.columns = new_header #Set the header row as the df header
#Drop the column with all NaNs
df = df.dropna(axis=1, how='all')
df = df.T #Transpose
#Must find a way to do this part programtically
#Manually changing the index currently
df.index = [245.0, 245.1, 867.0, 867.1]
iPrev = ""
l1 = []
for i in df.index:
indexNow = str(i)[:3]
#print(indexNow)
if iPrev == indexNow:
#print(df.at[i, 3], df.at[i, 4])
l2.append(df.at[i, 3])
l3.append(df.at[i, 4])
l1.append(l2)
l1.append(l3)
l2 = []
l3 = []
else:
iPrev = indexNow
l2 = [i, df.at[i, 1], df.at[i, 3]]
l3 = [i, df.at[i, 1], df.at[i, 4]]
#print(l2)
result = pd.DataFrame(l1, columns = ['ID','Company','ColumnNeeded','ColumnValue'])
print(result)
给
ID Company ColumnNeeded ColumnValue
0 245.0 Reddit RedditInsight C
1 245.0 Reddit RedditText H
2 867.0 Facebook FacebookInsights A
3 867.0 Facebook FacbookText L
推荐阅读
- python - 将来自 linalg.eig 的复杂特征向量存储到 Python 中的数组中
- javascript - 替换 DATE javascript 的时区偏移量
- pandas - 将某个字段中的一些值替换为另一个字段
- r - 我可以在没有 for 循环的情况下在 R 中进行矢量文本搜索吗?
- java - 无法使用 Java 语言访问类,但可以使用 Kotlin
- regex - 使用正则表达式匹配电子邮件法律声明
- powerbi - 如何将报告限制为仅显示当前数据
- javascript - appendChild 不适用于使用 window.open() 的新窗口
- typescript - 为什么这个程序在调用我的“then”子句之前就退出了?
- java - Java 正则表达式匹配比较运算符