Pandas:在列中查找最小值,将包含该列的行写入新的数据帧
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/31882058/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Pandas: Find minimum value in a column, write the row containing that column to a new dataframe
提问by ASHB
I have a large number of simple time series in unique CSV files. Each file contains a "Date" column and "Close" column.
我在独特的 CSV 文件中有大量简单的时间序列。每个文件都包含一个“日期”列和“关闭”列。
I would like to use pandas to read the data for each file into a data frame, find the minimum value in the "Close" column, and write both the minimum "Close" value and associated "Date" to a new dataframe.
我想使用 Pandas 将每个文件的数据读入数据框,在“关闭”列中找到最小值,并将最小的“关闭”值和关联的“日期”写入新的数据框。
This would ideally produce a new dataframe that contains minimum "Close" values and the date on which that minimum occurred, for all files screened.
理想情况下,这将生成一个新的数据框,其中包含最小“关闭”值和该最小值发生的日期,适用于所有筛选的文件。
import pandas as pd
import os
symbol = "LN"
start_year = 2010
end_year = 2014
months = ["G", "J", "M", "N", "Q", "V", "Z"]
def historiclows():
df1 = pd.read_csv("%s.csv" % (file3))
df1 = df1.drop(df1.columns[[1,2,3,5,6]], axis = 1)
targetvalues = df1.loc[df1["Close"].idxmin()]
df2.append(targetvalues)
for m in months:
df2 = pd.DataFrame()
for y in range(start_year, end_year+1):
if m != "Z":
if months[months.index(m)+1] != "Z":
file1 = ("%s%s%s%s%s%s" % (symbol, m, y, symbol, months[months.index(m)+1], y))
file2 = ("%s%s%s%s%s%s" % (symbol, months[months.index(m)+1], y, symbol, months[months.index(m)+2], y))
file3 = ("%s%s" % (file1, file2))
checkfile3 = os.path.isfile("%s.csv" % file3)
if checkfile3 == True:
title = ("%s%s%s" % (m, months[months.index(m)+1], months[months.index(m)+2]))
historiclows()
print(df2)
else:
pass
else:
file1 = ("%s%s%s%s%s%s" % (symbol, m, y, symbol, months[months.index(m)+1], y))
file2 = ("%s%s%s%s%s%s" % (symbol, months[months.index(m)+1], y, symbol, str(months[0]), y+1))
file3 = ("%s%s" % (file1, file2))
checkfile3 = os.path.isfile("%s.csv" % file3)
if checkfile3 == True:
title = ("%s%s%s" % (m, months[months.index(m)+1], str(months[0])))
historiclows()
print(df2)
else:
pass
else:
file1 = ("%s%s%s%s%s%s" % (symbol, m, y, symbol, str(months[0]), y+1))
file2 = ("%s%s%s%s%s%s" % (symbol, str(months[0]), y+1, symbol, str(months[1]), y+1))
file3 = ("%s%s" % (file1, file2))
checkfile3 = os.path.isfile("%s.csv" % file3)
if checkfile3 == True:
title = ("%s%s%s" % (m, str(months[0]), str(months[1])))
historiclows()
print(df2)
else:
pass
print("!!! PROCESS COMPLETE !!!")
打印(“!!!过程完成!!!”)
回答by DeepSpace
You can simply do:
你可以简单地做:
>> orig_df
Close
2015-01-01 4
2015-02-01 1
2015-03-01 3
2015-03-01 1
new_df = orig_df[orig_df['Close'] == min(orig_df['Close'])]
>> new_df
Close
2015-02-01 1
2015-03-01 1
Then if you only want the minimum to appear once in the new dataframe you can use drop_duplicates:
然后,如果您只希望最小值在新数据框中出现一次,则可以使用drop_duplicates:
new_df.drop_duplicates(subset=['Close'], inplace=True)
>> Close
2015-02-01 1
If you want the last date and not the first date, do
如果您想要最后一个日期而不是第一个日期,请执行
new_df.drop_duplicates(subset=['Close'], inplace=True, take_last=True)

